копирование содержимого 1.txt в 2.txt
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 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го аргумента?
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 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 один из аргументом получается кол-во прочитанных байт, вот ты смотришь, сколько байт прочиталось. после, записываешь столько же сколько прочитал, тогда уберутся левые символы
Надеюсь все понятно.
и лучше читать в цикле while, т.е. пока есть возможность читать, читаешь, помоему в fread один из аргументом получается кол-во прочитанных байт, вот ты смотришь, сколько байт прочиталось. после, записываешь столько же сколько прочитал, тогда уберутся левые символы
Я бы не согласился. По моему лучше сначала узнать размер файла (например, установив указатель в конец файла fseek() и узнав его позицию ftell(), я в свое время ничего лучше не придумал:( ). Далее можно определить размер массива и создать его динамически с помощью new, если файл имеет приемлимые размеры или же подобрать розмеры читаемого блока таким образом, чтобы делать как можно меньше циклов чтения-записи, а то вдруг получится что за раз читаем 1024 байта, а файл розмером в неск. сотен килов, тогда неск сот циклов чтения-записи, что вредно для скорости (да еще и тяжелые вызовы функций). В общем выбирай :D
Возможно лучше и так, но в вопросах оптимизации лучше использовать while, т.к. время выполнения очень большое, если большой файл, пока ты найдешь его позицию, пока посчитаешь, пока создашь и все равно для записи будешь использовать тот же while:-) а так. ты одним while'ом читаешь и пишешь.
А вот что получилось согласно NeO_u:
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) в них я написал потому что ничего другого не придумал
А вот что получилось согласно NeO_u:
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) в них я написал потому что ничего другого не придумал
Вот как надо:
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 - записывает размер прочитанных данных.
А тебе обязательно через FILE *f делать? или важен только результат, т.е. чтобы содержимое файла 2.txt бало таким же как 1.txt...?
А тебе обязательно через FILE *f делать? или важен только результат, т.е. чтобы содержимое файла 2.txt бало таким же как 1.txt...?
Я тоже не понял этого момента.
Можно же сделать вплоть до такого:
..
{
..
CopyFileTo( "C:\\1.txt", "C:\\2.txt" );
..
}
int main()
{
CopyFile("C:\\1.txt" "C:\\2.txt");
}
Конечно можно было воспользоваться CopyFileTo( "C:\\1.txt", "C:\\2.txt" ); но я хотел сделать именно копирование содержимого
Предложеный тобой способ чреват ошибками. Приведу цитату из мсдн:
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–linefeed translation. Use ftell with fseek or _ftelli64 with _fseeki64 to return to file locations correctly.
Из чего следует, что (!!) за счет терминальных символов возвращаемое значение функцией может не соответствовать реальному смещению в байтах от начала файла. Следовательно динамически выделеный буфер может оказаться недостаточного размера. обработка файла потоком - "пока можно читать - читаем" - есть более безопасной..
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 - записывает размер прочитанных данных.
мммм. а что С++ и потоки уже отменили?
...
ifstream filein("t1.txt",ios_base::binary);
ofstream fileout("t2.txt",ios_base::binary|ios_base::app);
fileout << filein.rdbuf();
это в случае если надо читать без обработки данные.
Если надо обрабатывать:
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());// Записуем ровно столько сколько прочли
}
естественно размер буфера - исключительно исходя из твоих задач.
Код полностью переносим и работает на любой системе.
З.Ы. Поиск надо использовать а не задавать одни и теже вопросы с упорством достойным дятла.
Потоки никто не отменял:-) естественно можно было все сделать потоками, но я давал ответ исходя из условия:-) в условии fwrite-fread, слеовадотель в ответе точно так же должен присутствовать fwrite-fread. Мне так показалось.