Решение простое, но требует от вас дополнительной информации о деталях данного формата файла.
Однако, некоторый псевдокод для универсального решения (простой C, запросите реализацию C ++, когда хотите):
#define BUFSIZE 4096 // 4k, try larger or smaller values to improve performance...
int process_file( const char* filename ) {
char buffer[BUFSIZE];
size_t nread;
FILE* fp;
if( (fp=fopen(filename,"rb"))==NULL ) return 1;
while( (nread=fread(buffer,1,BUFSIZE,fp))>=0 ) {
if( nread==0 ) break; // EOF
process_file_buffer( buffer, nread );
}
fclose(fp);
return nread>=0 ? 0 : 2; // 0==success, 2==read error, check "errno"!
}
void process_file_buffer( const char* buffer, size_t size ) {
// process, and write result to target file
}
EDIT
Относительно ваших сомнений в вопросах управления памятью: это во многом зависит от вашего фактического кода и ваших реальных требований. В моем примере кода есть только один единственный буфер, автоматически распределяемый по стеку, которого вполне достаточно для этого варианта использования.
Однако, если у вас есть особые требования, то уточняйте их!
ДРУГОЕ РЕДАКТИРОВАНИЕ:
Этот код является надежным и обеспечивает идеальную основу для большего. Однако: если у вас когда-нибудь возникнут проблемы с производительностью, вам действительно нужно запустить профилировщик (или написать & свой собственный код профилирования).
Почему?
Вы можете подозревать, что ЭТОТ КОД является узким местом, но я держу пари, что этого не будет;) Не забывайте, что вы также должны написать что-то для DISK, и не забывайте, что вы должны пройти любой один байт файла через память - и оттуда через регистры ЦП - для его обработки (это было одним из ваших реальных требований ...).
SO: Не обращайте внимания на ввод-вывод в память. Сначала вы должны думать о чем-то еще;)
Вам, наверное, не нравится это слышать. Но это просто ваша первоначальная ситуация.
И, прежде чем вы начнете думать об управлении памятью, вы должны начать думать о ваших реальных требованиях к I..O ...
ЕЩЕ ДРУГОЕ РЕДАКТИРОВАНИЕ:
KISS - будь проще, глупый; -)