2012-09-29 3 views
0

У меня есть два вопроса о функции ReadFile от Win32 API. Прежде всего, при условии, чтоФункция ReadFile от Win32 API

BOOL WINAPI ReadFile(
         _In_   HANDLE hFile, 
         _Out_  LPVOID lpBuffer, 
         _In_   DWORD nNumberOfBytesToRead, 
         _Out_opt_ LPDWORD lpNumberOfBytesRead, 
         _Inout_opt_ LPOVERLAPPED lpOverlapped 
        ); 

третий и четвертый параметры имеют тип DWORD, который может содержать не более 1^32 без переполнения. Означает ли это, что ReadFile может читать только файл с данными размером менее 1 × 32 байта за раз? Если это правда, я хочу, чтобы прочитать файл больше 1^32, я поставил ReadFile в петле, как этот

char buffer[1<<32]; 
while(!EOF){ 
    ReadFIle(filename,buffer,1^32,bytesout,NULL); 
    SomeFunctionToExtractDataFromBuffer(buffer) 
} 

предполагал петля имеет тенденцию к перезаписи буфера каждой итерации для того, чтобы это дизайн для работы, ReadFile должен помнить, где предыдущее чтение произошло в файле, это правда? или есть другие способы достижения этого. Большое спасибо

+0

Пожалуйста, измените название этого вопроса, чтобы он был полезным для будущих посетителей сайта. В противном случае он будет закрыт как слишком локализованный. –

ответ

3

Третий и четвертый параметры имеют тип DWORD, который может содержать максимум 1^32 без переполнения. Означает ли это, что ReadFile может только читать файл с объемом данных менее 1 × 32 байта за раз?

№ Это означает, что он может считывать до 2^32 байта за один раз. Никто не мешает вам позвонить ReadFile несколько раз, чтобы прочитать в общей сложности столько байтов, сколько вам нравится (каждый прочитанный будет продвигать file pointer, поэтому он начнет отсчет с того места, где было остановлено предыдущее чтение).

предполагало петля имеет тенденцию к перезаписи буфера каждой итерации в для того, чтобы этой конструкции для работы, то ReadFile нужно помнить, где предыдущее чтение произошло в файле это правда?

Да, ОС запоминает это для каждого открытого файла (см. Ссылку на указатель файла выше).

Хотя по этому вопросу я должен упомянуть, что если вы планируете читать 4 ГБ, вы, скорее всего, делаете что-то неправильно. Независимо от того, какова природа ваших данных, вы можете обрабатывать ее в небольших кусках, и это поможет не справляться с множеством проблем, таких как доступная память.

+0

Полезно знать, они действительно должны указывать это в своей документации. На самом деле я обрабатываю его небольшими кусками, например, несколькими МБ за раз. Просто интересуйтесь указателем файла функции ReadFile, если он помнит, где он был. еще раз спасибо –

Смежные вопросы