| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Функция ReadFile |
| Автор: andreykeil 18.10.2008, 13:43 | ||
| Всем здрасте! Есть API-функция ReadFile:
Там третьим параметром передаётся необходимое число прочитанных байт - nNumberOfBytesToRead. При этом оговаривается, что число "nNumberOfBytesToRead" не должно быть больше размера буфера. Как узнать, какой размер буфера установлен в программе(в Windows-е)? Естественно, я его(буфер) не менял. |
| Автор: bel_nikita 18.10.2008, 13:54 | ||
Так, размер буфера ты же сам и устанавливаешь |
| Автор: andreykeil 18.10.2008, 14:00 |
| Вопрос возник в связи с чтением Архангельского... Может он путает что-то. Проясните, плиз. |
| Автор: eyeofhell 18.10.2008, 15:39 | ||
|
| Автор: andreykeil 18.10.2008, 16:08 |
| Не совсем поняли меня. А если я укажу размер буфера 256000000 байт и его не окажется? Что тогда делать? |
| Автор: Lazin 18.10.2008, 16:29 |
| ничего не будет, функция вернет ошибку Добавлено через 54 секунды andreykeil, найди описание функции в MSDN, там все расписано |
| Автор: eyeofhell 18.10.2008, 16:45 | ||
Указывая размер буфера, Вы берете на себя обязательства предоставить память соответствующего размера. Если вы выделите 10 байт памяти char buffer[ 10 ], укажете ее и размер 256000000 байт - то функция ReadFile запишет 10 байт в buffer и начнет писать дальше в невыделенную память. Закончится это наверное access violation Как обычно делают: 1. Получают размер файла int size = GetFileSize( hFile, 0 ) 2. Выделяют память с помощью char* buffer = malloc( size ) 3. Считывают файл, в выделенную память с помощью ReadFile( ..., buffer, size, ... ) 4. Делают со считанным что надо 5. Освобождают память с помощью free( buffer ) |
| Автор: eyeofhell 18.10.2008, 18:16 | ||
Теологический вопрос. Конкретно с цифрой 256000000 функция действительно сначала убедится, что в эту память можно писать. И если давать буфер на стеке, размер которого ( стека ) растет динамически и обычно байт 20-30, то вернет 0. Но если сделать char buffer[ 2 ], ReadFile( buffer, 10 ) - то получим затираение стека с последующим возратном неизвестно куда и access violation при попытке исполнить там код. Так что не надо так делать (с) |