В моя код имам ситуация, в която трябва да копирам данни от един файл в друг. Решението, което измислих, изглежда така:
const int BUF_SIZE = 1024;
char buf[BUF_SIZE];
int left_to_copy = toCopy;
while(left_to_copy > BUF_SIZE)
{
fread(buf, BUF_SIZE, 1, fin);
fwrite(buf, BUF_SIZE, 1, fout);
left_to_copy -= BUF_SIZE;
}
fread(buf, left_to_copy, 1, fin);
fwrite(buf, left_to_copy, 1, fout);
Основната ми мисъл беше, че може да има нещо като memcpy, но за данни във файлове. Просто му давам два файлови потока и общия брой байтове. Потърсих малко, но не можах да намеря такова нещо.
Но ако нещо подобно не е налично, какъв размер на буфера трябва да използвам, за да направя прехвърлянето най-бързо? По-голямо би означавало по-малко системни извиквания, но реших, че може да обърка друго буфериране или кеширане в системата. Трябва ли динамично да разпределя буфера, така че да поема само двойка извиквания за четене/запис? Типичните размери на трансфер в този конкретен случай са от няколко KB до десетина MB.
РЕДАКТИРАНЕ: За специфична информация за ОС, ние използваме Linux.
РЕДАКТИРАНЕ 2:
Опитах да използвам sendfile, но не се получи. Изглежда, че пише правилното количество данни, но беше боклук.
Замених примера си по-горе с нещо, което изглежда така:
fflush(fin);
fflush(fout);
off_t offset = ftello64(fin);
sendfile(fileno(fout), fileno(fin), &offset, toCopy);
fseeko64(fin, offset, SEEK_SET);
Добавих флъш, offest и searching един по един, тъй като изглеждаше, че не работи.
ifstream i; ofstream o; /*open both*/; o << i.rdbuf();
? Гарантираната преносимост не е нещо за пренебрегване... - person ildjarn   schedule 11.05.2012toCopy
байта. - person stands2reason   schedule 11.05.2012fread()
е по-малка отBUF_SIZE
? В този случай ще пишете боклуци вfout
. Освен това вашият код ефективно закръгля размераtoCopy
до следващото кратно наBUF_SIZE
. В зависимост от вашата употреба, това може или не може да бъде проблем за вас. - person Greg Hewgill   schedule 11.05.2012