Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2011, 10:15   #1
Fog
Пользователь
 
Аватар для Fog
 
Регистрация: 29.08.2010
Сообщений: 76
Вопрос проблема с ReadFile

Необходимо прочитать содержимое файла в буффер для последующей
отправки по сети. Возникает проблема с чтением из файла в буффер.
Вот как я читаю:
Код:
//hfile дескриптор файла -  полученный от CreateFile 
//FileSize размер файла -  получил от GetFileSize
//buffer мой буффер куда я читаю -  buffer[FileSize]
int iResult; 
DWORD iBytesRead;
//Читаю
iResult = ReadFile(hFile,(char*)buffer,sizeof(buffer),&iBytesRead,NULL);
//Проверяю на ошибку
if(!iResult){
 cout<<"Не смог прочитать: "<<GetLastError();
 Sleep(2000);
 return 1;
}
//Вывожу на экран
cout<<"Прочитали из файла: "<<IBytesRead<<endl; //много 2332523 
cout<<buffer; //Вижу только MZP т.е заголовок .exe файла и все
//И даже cout<<strlen(buffer) дает 4 а читали то из файла много
//то есть ReadFile то читает а в буффер не заносит
return 0;
}
Подскажите пожалуйста в чем моя ошибка??? Или может надо блоками читать а не целиком. Или может в цикле читать надо типа:
while(!EOF()){
 Читаю...
}
Буду
рад любому примеру - совету - рекомендации.

Последний раз редактировалось rpy3uH; 01.02.2011 в 11:56.
Fog вне форума Ответить с цитированием
Старый 01.02.2011, 11:14   #2
Fog
Пользователь
 
Аватар для Fog
 
Регистрация: 29.08.2010
Сообщений: 76
По умолчанию

Разобрался. Можно закрывать
Fog вне форума Ответить с цитированием
Старый 01.02.2011, 11:19   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Fog Посмотреть сообщение
cout<<buffer; //Вижу только MZP т.е заголовок .exe файла и все
//И даже cout<<strlen(buffer) дает 4 а читали то из файла много
Для вас новость, что в С строки оканчиваются нулем?

Цитата:
Сообщение от Fog Посмотреть сообщение
//то есть ReadFile то читает а в буффер не заносит
Ага, чукча не писатель, чукча читатель. По-вашему ReadFile() с интересом прочитал ваш файл, а потом решил, что ещё и буфер заполнять — это уже слишком?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.02.2011, 12:31   #4
Fog
Пользователь
 
Аватар для Fog
 
Регистрация: 29.08.2010
Сообщений: 76
По умолчанию

Цитата:
Для вас новость, что в С строки оканчиваются нулем?
Да не в нультерминаторе дело я ж говорил strlen() тож 4 выдает.
Чтоб посмотреть что в массиве (сout же выводит все пока не увидит \0) я в
файл записал свой массив. Вообще думаю не стоит читать файл в буфер целиком перед передачей а частями. Если файл допустим на 2 - гигу будет то что ж 2 - гиговый динам - массив заказать у системы. И тут кажется должен цикл быть
пока не достигнули конца файла читаем порциями по 2 kb и передаем. А у клиента получаем порциями и пишем.
Fog вне форума Ответить с цитированием
Старый 01.02.2011, 12:51   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Fog Посмотреть сообщение
Да не в нультерминаторе дело я ж говорил strlen() тож 4 выдает.
Хм, а strlen() как по-вашему работает? Мне казалось, что она тоже до первого нуль-терминатора строку сканирует.

Цитата:
char mystr[100]="test string";

defines an array of characters with a size of 100 chars, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, while sizeof(mystr) evaluates to 100, strlen(mystr) returns 11.
Цитата:
Сообщение от Fog Посмотреть сообщение
пока не достигнули конца файла читаем порциями по 2 kb и передаем. А у клиента получаем порциями и пишем.
Это да. Но проще мапить файл в память, тогда и читать ничего не надо = экномия ресурсов.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование динамического массива в функции ReadFile (WinAPI). Korrado Помощь студентам 7 29.11.2009 13:38
ReadFile nazavrik Общие вопросы C/C++ 14 22.11.2009 15:11
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37