powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ReadFile и текстовый файл
10 сообщений из 10, страница 1 из 1
ReadFile и текстовый файл
    #34825909
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ли возможность читать сабжевой функцией построчно текстовый файл или придется брать абстрактного размера буфер и проводить парсинг на предмет переноса каретки?
Спасибо
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #34825912
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumесли ли возможность читать сабжевой функцией построчно текстовый файлнет
Cerebrum или придется брать абстрактного размера буфер и проводить парсинг на предмет переноса каретки?да
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #34826940
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
....
			m_hFile = ::CreateFile(str, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, bRemovePrev ? CREATE_ALWAYS : OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
			if (m_hFile != INVALID_HANDLE_VALUE)		// открыт успешно 
			{
				DWORD dwSize = ::GetFileSize(m_hFile, NULL);
				if (dwSize)								// в файле уже есть записи
				{
					DWORD	dwRead	 =  0 ;				// считано данных при ReadFile		
					DWORD	buf_size =  4096 ;			// размер буфера
					void*	pBuffer  = NULL;			// сам буфер
					if(dwSize <= buf_size)				// весь файл меньше 4 кб, но не пуст!
					{									// читаем целиком
						void* pBuffer = malloc(dwSize);
						if(pBuffer)						// зарезервировано успешно
						{
							memset(pBuffer,  0 , sizeof(pBuffer));
							if(::ReadFile(m_hFile, pBuffer, dwSize, &dwRead, NULL))
							{							// считано успешно
								::MessageBox(NULL, (TCHAR*)pBuffer,  0 ,  0 );
								// файл считывается нормально, но в конце мусор
							}
	.....
}

функция показывает, что считалось ровно столько сколько просил, т.е. dwSize. Откуда мусор в конце буфера? Мне самому что ли надо ставить символ окончания строки?

--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #34828904
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumфункция показывает, что считалось ровно столько сколько просил, т.е. dwSize. Откуда мусор в конце буфера? Мне самому что ли надо ставить символ окончания строки?конечно
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #34828945
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Cerebrumфункция показывает, что считалось ровно столько сколько просил, т.е. dwSize. Откуда мусор в конце буфера? Мне самому что ли надо ставить символ окончания строки?конечно
а вот и нет, в memset ошибка!

исправил заработало без мусора
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #34828980
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum White Owl Cerebrumфункция показывает, что считалось ровно столько сколько просил, т.е. dwSize. Откуда мусор в конце буфера? Мне самому что ли надо ставить символ окончания строки?конечно
а вот и нет, в memset ошибка!В данном случае, она не важна. Можно обойтись вообще без memset()

Cerebrumисправил заработало без мусораЭто случайность. Просто повезло что следующий байт после буфера был нулем.

Если хочешь читать весь файл за раз, то делать надо так:
Код: plaintext
1.
2.
3.
4.
DWORD dwSize = ::GetFileSize(m_hFile, NULL);
void* pBuffer = malloc(dwSize +  1 );
ReadFile(m_hFile, pBuffer, dwSize, &dwRead, NULL);
pBuffer[dwSize] =  0 ;
MessageBox(NULL, (TCHAR*)pBuffer,  0 ,  0 );
Обрати внимание на +1 в malloc.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ReadFile и текстовый файл
    #38910101
astrotrain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlЕсли хочешь читать весь файл за раз, то делать надо так:
Код: plaintext
1.
2.
3.
4.
5.
DWORD dwSize = ::GetFileSize(m_hFile, NULL);
void* pBuffer = malloc(dwSize + 1);
ReadFile(m_hFile, pBuffer, dwSize, &dwRead, NULL);
pBuffer[dwSize] = 0;
MessageBox(NULL, (TCHAR*)pBuffer, 0, 0);

Обрати внимание на +1 в malloc.

У меня ругается что размер pBuffer не определен.
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #38910124
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
astrotrainУ меня ругается что размер pBuffer не определен.
по хорошему проверять надо что память выделилась и освобождать в конце.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
void* pBuffer = malloc(dwSize + 1);
if(pBuffer) {
  ReadFile(m_hFile, pBuffer, dwSize, &dwRead, NULL);
...
  free(pBuffer);
}
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #38910190
astrotrain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, хорошо, но все равно проблема остается.
Код: plaintext
1.
'void *' : unknown size	
...
Рейтинг: 0 / 0
ReadFile и текстовый файл
    #38910314
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
astrotrainDima T, хорошо, но все равно проблема остается.
Код: plaintext
1.
'void *' : unknown size	

весь код давай, ктож знает, чего ты там наворотил?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ReadFile и текстовый файл
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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