Классы iostream позаботятся обо всей необходимой буферизации, так что вам не нужно.Обычная идиома для копирования всего файла просто:
fout << fin.rdbuf();
iostream позаботится обо всей необходимой буферизации.(Это несколько необычное использование <<
, поскольку оно не форматирует. Исторические причины, без сомнения.)
Если вам нужен цикл, возможно, потому что вы хотите сделать некоторые преобразования в данных допереписать его, тогда это будет немного сложнее, так как istream::read
«терпит неудачу», если он не читает запрошенное количество символов.Из-за этого вы также должны проверить, сколько символов было прочитано, и обработать их, даже если чтение не удалось:
int readCount;
while ( fin.read( &buf[0], buf.size() )
|| (readCount = fin.gcount()) != 0 ) {
// ...
fout.write( &buf[0], readCount );
}
Это довольно уродливо;лучшее решение может заключаться в том, чтобы обернуть буфер в классе и определить operator<<
для этого класса.