Мне нужен кроссплатформенный, без внешней библиотеки, способ копирования файла. В моем первом проходе я придумал (обработка ошибок опущена):
char buffer[LEN];
ifstream src(srcFile, ios::in | ios::binary);
ofstream dest(destFile, ios::out | ios::binary);
while (!src.eof()) {
src.read(buffer, LEN);
dest.write(buffer, src.gcount());
}
Это прекрасно сработало, и я точно знал, что он делает.
Затем я нашел сообщение в stackoverflow (извините, не могу найти ссылку прямо сейчас), в котором говорится, что я могу заменить весь приведенный выше код на:
dest << src.rdbuf();
Это красиво и компактно, но многое скрывает о том, что он делает. Это также оказывается очень медленным , потому что реализация ofstream::operator‹‹(streambuf) перемещает вещи по 1 символу за раз (используя snetxc()/sputc()).
Есть ли способ сделать этот метод быстрее? Есть ли недостаток в моем оригинальном методе?
Обновление: есть что-то неэффективное в использовании оператора‹‹(streambuf) в Windows. Цикл .read()/.write() всегда работает лучше, чем оператор‹‹.
Также изменение размера буфера в приведенном выше коде не влияет на размер операций чтения и записи на жесткий диск. Для этого вам нужно установить буферы с помощью stream.rdbuf()->pubsetbuf().
define
скопировать для каждой платформы? или использовать буст? - person Daniel A. White   schedule 31.08.2011dest.write(src.rdbuf(), size);
? - person Kerrek SB   schedule 31.08.2011write
принимаетchar const*
, ноrdbuf
возвращаетstd::filebuf
- как это будет работать? - person ildjarn   schedule 31.08.2011std::filebuf
, например, вероятно, не первое, о чем разработчик может подумать как о проблеме с производительностью. - person Nicol Bolas   schedule 31.08.2011src.rdbuf().pbase()
? - person Kerrek SB   schedule 31.08.2011pptr
иpbase
защищены, поэтому не напрямую. В любом случае, я на самом деле просто надеялся, что ты знаешь что-то, чего не знал я оstd::filebuf
, что позволило бы этому сработать. :-П - person ildjarn   schedule 31.08.2011