Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция ReadFile, сколько байт указывать 
V
    Опции темы
andreykeil
Дата 18.10.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



  Всем здрасте!
Есть API-функция ReadFile:
Цитата

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


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

PM MAIL   Вверх
bel_nikita
Дата 18.10.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



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

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


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
andreykeil
Дата 18.10.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



  Вопрос возник в связи с чтением Архангельского...
Может он путает что-то. Проясните, плиз. smile 
PM MAIL   Вверх
eyeofhell
Дата 18.10.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Код

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

PM MAIL ICQ   Вверх
andreykeil
Дата 18.10.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Lazin
Дата 18.10.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



ничего не будет, функция вернет ошибку

Добавлено через 54 секунды
andreykeil, найди описание функции в MSDN, там все расписано smile 
PM MAIL Skype GTalk   Вверх
eyeofhell
Дата 18.10.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Код

А если я укажу размер буфера 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 )

PM MAIL ICQ   Вверх
Lazin
Дата 18.10.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(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 
PM MAIL Skype GTalk   Вверх
eyeofhell
Дата 18.10.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Цитата


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



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

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

Это сообщение отредактировал(а) eyeofhell - 18.10.2008, 18:17
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.