Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Функция ReadFile


Автор: andreykeil 18.10.2008, 13:43
  Всем здрасте!
Есть API-функция ReadFile:
Цитата

BOOL ReadFile(HANDLE hFile, 
              LPVOID lpBuffer,  
              DWORD nNumberOfBytesToRead,
              LPDWORD lpNumberOfBytesRead,
              LPOVERLAPPED lpOverlapped);    


 Там третьим параметром передаётся необходимое число прочитанных байт - nNumberOfBytesToRead. При этом оговаривается, что число "nNumberOfBytesToRead" не должно быть больше размера буфера.
Как узнать, какой размер буфера установлен в программе(в Windows-е)? Естественно, я его(буфер) не менял.

Автор: bel_nikita 18.10.2008, 13:54
Цитата(andreykeil @ 18.10.2008,  12:43)
Как узнать, какой размер буфера установлен в программе(в Windows-е)? Естественно, я его(буфер) не менял.

Так, размер буфера ты же сам и устанавливаешь smile 

Автор: andreykeil 18.10.2008, 14:00
  Вопрос возник в связи с чтением Архангельского...
Может он путает что-то. Проясните, плиз. smile 

Автор: eyeofhell 18.10.2008, 15:39
Код

// подготовили 1000 байт памяти
char buffer[ 1000 ];
DWORD read = 0;
// вызвали ReadFile, указав подготовленную память и ее размер.
// Так как память мы сами готовили в предыдущей строке, то
// ее размер мы знаем - это 1000 байт. Если бы в предыдущей строке
// мы написали char buffer[ 2000 ], то и размер бы был 2000 байт. Ну
// и так далее.
BOOL result = ReadFile( hFile, buffer,  1000, & read, 0 );

Автор: andreykeil 18.10.2008, 16:08
Не совсем поняли меня.
А если я укажу размер буфера 256000000 байт и его не окажется? Что тогда делать?

Автор: Lazin 18.10.2008, 16:29
ничего не будет, функция вернет ошибку

Добавлено через 54 секунды
andreykeil, найди описание функции в MSDN, там все расписано smile 

Автор: eyeofhell 18.10.2008, 16:45
Код

А если я укажу размер буфера 256000000 байт и его не окажется? Что тогда делать?


Указывая размер буфера, Вы берете на себя обязательства предоставить память соответствующего размера. Если вы выделите 10 байт памяти char buffer[ 10 ], укажете ее и размер 256000000 байт - то функция ReadFile запишет 10 байт в buffer и начнет писать дальше в невыделенную память. Закончится это наверное access violation smile.

Как обычно делают:

1. Получают размер файла int size = GetFileSize( hFile, 0 )
2. Выделяют память с помощью char* buffer = malloc( size )
3. Считывают файл, в выделенную память с помощью ReadFile( ..., buffer, size, ... )
4. Делают со считанным что надо
5. Освобождают память с помощью free( buffer )

Автор: Lazin 18.10.2008, 16:59
Цитата(eyeofhell @  18.10.2008,  16:45 Найти цитируемый пост)
Закончится это наверное access violation

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

Цитата(eyeofhell @  18.10.2008,  16:45 Найти цитируемый пост)
1. Получают размер файла int size = GetFileSize( hFile, 0 )
2. Выделяют память с помощью char* buffer = malloc( size )
3. Считывают файл, в выделенную память с помощью ReadFile( ..., buffer, size, ... )
4. Делают со считанным что надо
5. Освобождают память с помощью free( buffer )

это можно делать только для маленьких файлов, большие лучше читать по частям smile 

Автор: eyeofhell 18.10.2008, 18:16
Цитата


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



Теологический вопрос. Конкретно с цифрой 256000000 функция действительно сначала убедится, что в эту память можно писать. И если давать буфер на стеке, размер которого ( стека ) растет динамически и обычно байт 20-30, то вернет 0. Но если сделать char buffer[ 2 ], ReadFile( buffer, 10 ) - то получим затираение стека с последующим возратном неизвестно куда и access violation при попытке исполнить там код.

Так что не надо так делать (с) smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)