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

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
Функция для чтения файла на WinAPI
    #38910163
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
astrotrain,

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



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



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



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



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

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

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

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


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

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

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

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

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

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

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


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