Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Функция для чтения файла на WinAPI / 22 сообщений из 22, страница 1 из 1
19.03.2015, 16:21
    #38910131
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Не получается никак осуществить. Во-первых не знаю как возвращать буфер с текстом. Сделать чтобы функция просто возвращала на него указатель? А во вторых она, почему-то не работает.

FileRead(_T("C:\\1.txt"));


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
void FileRead(LPCTSTR szFileName)
{
	HANDLE hFile; 
    DWORD  dwBytesRead = 0;
    //void* pBuffer  = NULL;
     

    hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);                 // no attr. template
 
    if (hFile == INVALID_HANDLE_VALUE) 
    {        
        _tprintf(TEXT("Terminal failure: unable to open file \"%s\" for read.\n"), szFileName);
        return; 
    }

	DWORD dwSize = GetFileSize(hFile, NULL);
	void* pBuffer = malloc(dwSize+1);
	//printf("%d",dwSize);
	//memset(pBuffer, 0, sizeof(pBuffer));
	
    if( FALSE == ReadFile(hFile, pBuffer, dwSize-1, &dwBytesRead, NULL) )
    {
        printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError());
        CloseHandle(hFile);
        return;
    }
    //pBuffer[dwSize] = 0;
   
	MessageBox(NULL, (TCHAR*)pBuffer, 0, 0);

}




Выдается ошибка GetLastError=00000057
Возможно это семерка ругается, из-за того что прав не хватает или что-то в этом роде. Гугление особо не помогло.
...
Рейтинг: 0 / 0
19.03.2015, 16:32
    #38910163
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrain,

0x57 = Invalid Parameter.
...
Рейтинг: 0 / 0
19.03.2015, 16:35
    #38910173
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
RWolf, ага, а какой параметр невалидный не подскажете?
...
Рейтинг: 0 / 0
19.03.2015, 16:39
    #38910187
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Отладка покажет. Для начала можно распечатать эти параметры перед вызовом.
...
Рейтинг: 0 / 0
19.03.2015, 16:50
    #38910209
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Убрал FILE_FLAG_OVERLAPPED (зачем он там был?). Но осталась проблема, часть файла выводится нормально, а в конце ерунда какая-то. Не пойму в чем дело. Файл сохранен ANSI as UTF-8.
...
Рейтинг: 0 / 0
19.03.2015, 17:14
    #38910254
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
TCHAR 16-битный, надо полагать?
...
Рейтинг: 0 / 0
19.03.2015, 17:28
    #38910280
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrain а в конце ерунда какая-то.
не в конце, а за ним. Потому что убрал установку конца
Код: plaintext
1.
//pBuffer[dwSize] = 0;



а убрал потому что не компилировалось, т.к. буфер void*
сделай
Код: plaintext
1.
char* pBuffer = (char*)malloc(dwSize+1);



PS WinAPI тебе зачем? Тут стандартных fopen(), fread() достаточно.
...
Рейтинг: 0 / 0
19.03.2015, 17:39
    #38910301
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Dima Tastrotrain а в конце ерунда какая-то.
не в конце, а за ним. Потому что убрал установку конца
Код: plaintext
1.
//pBuffer[dwSize] = 0;



а убрал потому что не компилировалось, т.к. буфер void*
сделай
Код: plaintext
1.
char* pBuffer = (char*)malloc(dwSize+1);



PS WinAPI тебе зачем? Тут стандартных fopen(), fread() достаточно.

Спасибо, так заработало. Интересно было было попробовать через WinAPI. Я кстати не совсем понял, где его применяют, учитывая что средствами языка проще/быстрее.
...
Рейтинг: 0 / 0
19.03.2015, 17:42
    #38910303
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Да, и еще хотел спросить. Вот я прочитал файл, он был в анси, а если бы содержимое в UTF-8 было, то как тогда себя вести? Нужно сначала определить в какой кодировке содержимое, а потом как действовать?
...
Рейтинг: 0 / 0
19.03.2015, 17:48
    #38910312
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainWinAPI. Я кстати не совсем понял, где его применяют, учитывая что средствами языка проще/быстрее.в реализации стандартных fopen(), fread(), чудес то не бывает )))
...
Рейтинг: 0 / 0
19.03.2015, 17:52
    #38910315
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainСпасибо, так заработало. Интересно было было попробовать через WinAPI. Я кстати не совсем понял, где его применяют, учитывая что средствами языка проще/быстрее.
WinAPI это средства ОС виндовс для работы с ресурсами ОС. Средства языка это ОС независимые средства, т.е. если под виндовсом компилируешь, то fopen() в итоге вызовет CreateFile(). Если под линуксом, что-то подобное из линукс API.

Зачем нужно: у CreateFile() есть возможности, которых нет в fopen(), это специфичные фишки виндовса. Например средствами WinAPI можно сделать проекцию файла в память. Т.е. в твоей задаче можно не выделять память и читать туда, а спроецировать файл в память и обращатся к нему как к области памяти.

Если интересно что WinAPI умеет: почитай книжку Джеффри РИХТЕР "Windows для профессионалов"
...
Рейтинг: 0 / 0
20.03.2015, 01:38
    #38910550
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainВот я прочитал файл, он был в анси, а если бы содержимое в UTF-8 было, то как тогда себя вести?
йад в аптеке
...
Рейтинг: 0 / 0
20.03.2015, 06:10
    #38910584
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainДа, и еще хотел спросить. Вот я прочитал файл, он был в анси, а если бы содержимое в UTF-8 было, то как тогда себя вести? Нужно сначала определить в какой кодировке содержимое, а потом как действовать?


Определить в какой кодировке содержимое невозможно. это надо ЗНАТЬ.
варианта два - предопределенные соглашения или метаданные проколола обмена высшего уровня.
...
Рейтинг: 0 / 0
20.03.2015, 06:13
    #38910586
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
метаданные файла тут, а не протокола, раз чтение файлов а не передача по сети.
...
Рейтинг: 0 / 0
20.03.2015, 06:49
    #38910597
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
MasterZivОпределить в какой кодировке содержимое невозможно. это надо ЗНАТЬ.
Возможно - эвристикой. В разных кодировках есть диапазоны кодов используемых в одной и неиспользуемых в другой. У меня так распознавание CP1251 и CP866 сделано.
...
Рейтинг: 0 / 0
20.03.2015, 11:16
    #38910822
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Dima TMasterZivОпределить в какой кодировке содержимое невозможно. это надо ЗНАТЬ.
Возможно - эвристикой. В разных кодировках есть диапазоны кодов используемых в одной и неиспользуемых в другой. У меня так распознавание CP1251 и CP866 сделано.

Угу, понятно. А еще хотел спросить. Вот в winapi, функций, например, для чтения строк не существует, получается? Если его использовать, то нужно либо свои функции городить либо просто функции библиотек языка юзать?
...
Рейтинг: 0 / 0
20.03.2015, 11:24
    #38910832
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainнужно либо свои функции городить либо просто функции библиотек языка юзать?
Да. Для того языки и придуманы чтобы велосипедов поменьше изобретать надо было.
...
Рейтинг: 0 / 0
20.03.2015, 11:46
    #38910882
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainв winapi, функций, например, для чтения строк не существует, получается?

Да. Файлы на уровне этого API - простая кучка байт. Их содержимое не анализируется и не
модифицируется при чтении или записи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2015, 13:11
    #38911051
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
astrotrainУгу, понятно. А еще хотел спросить. Вот в winapi, функций, например, для чтения строк не существует, получается? Если его использовать, то нужно либо свои функции городить либо просто функции библиотек языка юзать?

Работать с файлами средствами API OS -- малополезная штука. Программа становится непереносимой автоматом,
а полезный свойств не добавляется.
...
Рейтинг: 0 / 0
20.03.2015, 13:48
    #38911087
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Dima TMasterZivОпределить в какой кодировке содержимое невозможно. это надо ЗНАТЬ.
Возможно - эвристикой. В разных кодировках есть диапазоны кодов используемых в одной и неиспользуемых в другой. У меня так распознавание CP1251 и CP866 сделано.
Данная эвристика полезна когда пользователь-оператор "проглядывает" глазами результат конверсии.
99% эвристика угадывает. Но для коротких сообщений сложно принять точное решение.
...
Рейтинг: 0 / 0
20.03.2015, 14:02
    #38911111
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
maytonДанная эвристика полезна когда пользователь-оператор "проглядывает" глазами результат конверсии.
99% эвристика угадывает. Но для коротких сообщений сложно принять точное решение.
Добавь третье состояние "нераспознано", которое вызывает ошибку обработки и точность повышается до 99.99%.

А так на то он и текст, чтобы его в итоге кто-нибудь прочитал.

Лично мне это жизнь сильно упростило при работе с DBF со стороны: одни понагенерят всякими кривыми генераторами (в заголовке 1251 данные 866 или наоборот), другие звонят - "у нас какая-то фигня загрузилась"
Объемы данных достаточно большие, ошибок распознавания не было.
...
Рейтинг: 0 / 0
20.03.2015, 15:32
    #38911232
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для чтения файла на WinAPI
Ты не работал в *телекомах. Акт испорта данных от AMA,ESS, подписывают люди.
Они по любому смотрят глазами на данные. Декодинг cp866/1251 я тоже делал.
Как и все. Но это была дополнительная фича.

Кроме того после смерти dbf-импорта мы стали грузить данные через XML системы
а там вопрос кодировок был решёл окончательно.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Функция для чтения файла на WinAPI / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]