Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

копирование содержимого 1.txt в 2.txt

8.8K
10 октября 2007 года
opex
71 / / 17.01.2007
Есть текстовый файл 1.txt Хочу скопировать его содержимое в файл 2.txt
 
Код:
out=fopen("1.txt","r");
out1=fopen("2.txt","at");
char *st[1000];
fread(st,sizeof(out),700,out);
fwrite(st,sizeof(out),700,out1);
fclose(out);
fclose(out1);

Копирование происходит,но с добавлением посторонних символов,то есть содержимое 1.txt плюс еще каракули Мне не понятен 2ой и 3ий аргумент в функциях fread(),fwrite()
Вот прототипы этих функций:
 
Код:
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

Как известно, fread() читает из буфера n блоков данных размеров size каждый,а fwrite() записывает. Как определить аргументы size_t size, size_t n для произволного файла? уместно ли использовать sizeof(out) в качестве 2го аргумента?
489
10 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: opex
Есть текстовый файл 1.txt Хочу скопировать его содержимое в файл 2.txt
 
Код:
out=fopen("1.txt","r");
out1=fopen("2.txt","at");
char *st[1000];
fread(st,sizeof(out),700,out);
fwrite(st,sizeof(out),700,out1);
fclose(out);
fclose(out1);

Копирование происходит,но с добавлением посторонних символов,то есть содержимое 1.txt плюс еще каракули Мне не понятен 2ой и 3ий аргумент в функциях fread(),fwrite()
Вот прототипы этих функций:
 
Код:
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

Как известно, fread() читает из буфера n блоков данных размеров size каждый,а fwrite() записывает. Как определить аргументы size_t size, size_t n для произволного файла? уместно ли использовать sizeof(out) в качестве 2го аргумента?



смотри, в fwrite() 2й и 3й параметр это кол-во байт которые мы записываем, т.е. ты сейчас записываешь sizeof(out)*700, отсюда у тебя получаются каракули.
Тебе надо писать столько же символов сколько ты читаешь, например у тебя переменная st[1000], тогда вначале ты читаешь 1000 байт. потому ты их записываешь.
и лучше читать в цикле while, т.е. пока есть возможность читать, читаешь, помоему в fread один из аргументом получается кол-во прочитанных байт, вот ты смотришь, сколько байт прочиталось. после, записываешь столько же сколько прочитал, тогда уберутся левые символы

Надеюсь все понятно.

10K
10 октября 2007 года
FAngel
77 / / 13.09.2006
sizeof() не подходит. Это ведь только размер структуры (сколько структурка FILE байт занимает в памяти). Читать надо описания :cool: :)
Цитата:

и лучше читать в цикле while, т.е. пока есть возможность читать, читаешь, помоему в fread один из аргументом получается кол-во прочитанных байт, вот ты смотришь, сколько байт прочиталось. после, записываешь столько же сколько прочитал, тогда уберутся левые символы


Я бы не согласился. По моему лучше сначала узнать размер файла (например, установив указатель в конец файла fseek() и узнав его позицию ftell(), я в свое время ничего лучше не придумал:( ). Далее можно определить размер массива и создать его динамически с помощью new, если файл имеет приемлимые размеры или же подобрать розмеры читаемого блока таким образом, чтобы делать как можно меньше циклов чтения-записи, а то вдруг получится что за раз читаем 1024 байта, а файл розмером в неск. сотен килов, тогда неск сот циклов чтения-записи, что вредно для скорости (да еще и тяжелые вызовы функций). В общем выбирай :D

489
10 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: FAngel
Я бы не согласился. По моему лучше сначала узнать размер файла (например, установив указатель в конец файла fseek() и узнав его позицию ftell(), я в свое время ничего лучше не придумал:( ). Далее можно определить размер массива и создать его динамически с помощью new, если файл имеет приемлимые размеры или же подобрать розмеры читаемого блока таким образом, чтобы делать как можно меньше циклов чтения-записи, а то вдруг получится что за раз читаем 1024 байта, а файл розмером в неск. сотен килов, тогда неск сот циклов чтения-записи, что вредно для скорости (да еще и тяжелые вызовы функций). В общем выбирай :D



Возможно лучше и так, но в вопросах оптимизации лучше использовать while, т.к. время выполнения очень большое, если большой файл, пока ты найдешь его позицию, пока посчитаешь, пока создашь и все равно для записи будешь использовать тот же while:-) а так. ты одним while'ом читаешь и пишешь.

8.8K
10 октября 2007 года
opex
71 / / 17.01.2007
То что предложил FAngel не пробовал еще
А вот что получилось согласно NeO_u:
 
Код:
out=fopen("1.txt","r");
out1=fopen("2.txt","at");
char *st[1000];
while(feof(out)==0)//пока не достигнут конец
{
fread(st,sizeof(out),sizeof(out),out);
fwrite(st,sizeof(out),sizeof(out),out1);
};
fclose(out);
fclose(out1);


все отлично,вот только в конец файла 2.txt дописывается еще 1 Пока не знаю почему И все-таки не понятно зачем 2ий,3ий аргументы в функциях fread(),fwrite() если они мне никак не помогают,а sizeof(out) в них я написал потому что ничего другого не придумал
489
10 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: opex
То что предложил FAngel не пробовал еще
А вот что получилось согласно NeO_u:
 
Код:
out=fopen("1.txt","r");
out1=fopen("2.txt","at");
char *st[1000];
while(feof(out)==0)//пока не достигнут конец
{
fread(st,sizeof(out),sizeof(out),out);
fwrite(st,sizeof(out),sizeof(out),out1);
};
fclose(out);
fclose(out1);


все отлично,вот только в конец файла 2.txt дописывается еще 1 Пока не знаю почему И все-таки не понятно зачем 2ий,3ий аргументы в функциях fread(),fwrite() если они мне никак не помогают,а sizeof(out) в них я написал потому что ничего другого не придумал



Вот как надо:

Код:
FILE *fp1,*fp2;
    fp1 = fopen("test1.txt","r");
    fp2 = fopen("test2.txt","w+");
    const int size=256;
    char mas[size];
    size_t read;
    while((read = fread(mas,1,size,fp1)) != 0)
    {
        fwrite(mas,1,read,fp2);
    }
    fclose(fp1);
    fclose(fp2);

fread():
1) 2ая переменная указывает на то, какого размера наши данные. в данном случае 1 байт.
2) 3я переменная указывает сколько этих данных читаем
3) read - указывает сколько данных прочиталой
fwrite():
1) 2 и 3 переменная указывают на тоже самое.
2) read - записывает размер прочитанных данных.
490
11 октября 2007 года
frid-karatel
357 / / 15.09.2007
to opex:
А тебе обязательно через FILE *f делать? или важен только результат, т.е. чтобы содержимое файла 2.txt бало таким же как 1.txt...?
263
11 октября 2007 года
koltaviy
816 / / 16.12.2004
Цитата: frid-karatel
to opex:
А тебе обязательно через FILE *f делать? или важен только результат, т.е. чтобы содержимое файла 2.txt бало таким же как 1.txt...?


Я тоже не понял этого момента.
Можно же сделать вплоть до такого:

 
Код:
#include "IdGlobal.hpp"
..
{
..
CopyFileTo( "C:\\1.txt", "C:\\2.txt" );
..
}
11
11 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
через TFileStream::CopyFrom
92
11 октября 2007 года
Тень Пса
2.2K / / 19.10.2006
если пишешь под систему, почему бы не использовать её API?
 
Код:
#include <windows.h>

int main()
{
    CopyFile("C:\\1.txt" "C:\\2.txt");
}
8.8K
11 октября 2007 года
opex
71 / / 17.01.2007
Спасибо всем!
Конечно можно было воспользоваться CopyFileTo( "C:\\1.txt", "C:\\2.txt" ); но я хотел сделать именно копирование содержимого
255
11 октября 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: FAngel
Я бы не согласился. По моему лучше сначала узнать размер файла (например, установив указатель в конец файла fseek() и узнав его позицию ftell(), я в свое время ничего лучше не придумал:( ). Далее можно определить размер массива и создать его динамически с помощью new, если файл имеет приемлимые размеры или же подобрать розмеры читаемого блока таким образом, чтобы делать как можно меньше циклов чтения-записи, а то вдруг получится что за раз читаем 1024 байта, а файл розмером в неск. сотен килов, тогда неск сот циклов чтения-записи, что вредно для скорости (да еще и тяжелые вызовы функций). В общем выбирай :D



Предложеный тобой способ чреват ошибками. Приведу цитату из мсдн:

Цитата:

ftell and _ftelli64 return the current file position. The value returned by ftell and _ftelli64 may not reflect the physical byte offset for streams opened in text mode, because text mode causes carriage return&#8211;linefeed translation. Use ftell with fseek or _ftelli64 with _fseeki64 to return to file locations correctly.


Из чего следует, что (!!) за счет терминальных символов возвращаемое значение функцией может не соответствовать реальному смещению в байтах от начала файла. Следовательно динамически выделеный буфер может оказаться недостаточного размера. обработка файла потоком - "пока можно читать - читаем" - есть более безопасной..

1
11 октября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: NeO_u
Вот как надо:
Код:
FILE *fp1,*fp2;
    fp1 = fopen("test1.txt","r");
    fp2 = fopen("test2.txt","w+");
    const int size=256;
    char mas[size];
    size_t read;
    while((read = fread(mas,1,size,fp1)) != 0)
    {
        fwrite(mas,1,read,fp2);
    }
    fclose(fp1);
    fclose(fp2);

fread():
1) 2ая переменная указывает на то, какого размера наши данные. в данном случае 1 байт.
2) 3я переменная указывает сколько этих данных читаем
3) read - указывает сколько данных прочиталой
fwrite():
1) 2 и 3 переменная указывают на тоже самое.
2) read - записывает размер прочитанных данных.



мммм. а что С++ и потоки уже отменили?

 
Код:
#include <fstream.h>
...
ifstream filein("t1.txt",ios_base::binary);
ofstream fileout("t2.txt",ios_base::binary|ios_base::app);
fileout << filein.rdbuf();

это в случае если надо читать без обработки данные.
Если надо обрабатывать:
 
Код:
ifstream filein("t1.txt",ios_base::binary);
ofstream fileout("t2.txt",ios_base::binary|ios_base::app);
char buff[128];
while(!filein.eof()){
  filein.read(buff,128);
  // тут обрабатываешь...
fileout.write(buff,filein.gcount());// Записуем ровно столько сколько прочли
}

естественно размер буфера - исключительно исходя из твоих задач.
Код полностью переносим и работает на любой системе.
З.Ы. Поиск надо использовать а не задавать одни и теже вопросы с упорством достойным дятла.
489
12 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: kot_
мммм. а что С++ и потоки уже отменили?



Потоки никто не отменял:-) естественно можно было все сделать потоками, но я давал ответ исходя из условия:-) в условии fwrite-fread, слеовадотель в ответе точно так же должен присутствовать fwrite-fread. Мне так показалось.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог