Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / ReadFile и текстовый файл / 10 сообщений из 10, страница 1 из 1
25.09.2007, 20:58
    #34825909
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
если ли возможность читать сабжевой функцией построчно текстовый файл или придется брать абстрактного размера буфер и проводить парсинг на предмет переноса каретки?
Спасибо
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
25.09.2007, 21:00
    #34825912
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
Cerebrumесли ли возможность читать сабжевой функцией построчно текстовый файлнет
Cerebrum или придется брать абстрактного размера буфер и проводить парсинг на предмет переноса каретки?да
...
Рейтинг: 0 / 0
26.09.2007, 11:13
    #34826940
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
делаю
Код: 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
26.09.2007, 17:32
    #34828904
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
Cerebrumфункция показывает, что считалось ровно столько сколько просил, т.е. dwSize. Откуда мусор в конце буфера? Мне самому что ли надо ставить символ окончания строки?конечно
...
Рейтинг: 0 / 0
26.09.2007, 17:37
    #34828945
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
White Owl Cerebrumфункция показывает, что считалось ровно столько сколько просил, т.е. dwSize. Откуда мусор в конце буфера? Мне самому что ли надо ставить символ окончания строки?конечно
а вот и нет, в memset ошибка!

исправил заработало без мусора
...
Рейтинг: 0 / 0
26.09.2007, 17:43
    #34828980
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
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
Период между сообщениями больше года.
19.03.2015, 16:12
    #38910101
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
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
19.03.2015, 16:19
    #38910124
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
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
19.03.2015, 16:42
    #38910190
astrotrain
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
Dima T, хорошо, но все равно проблема остается.
Код: plaintext
1.
'void *' : unknown size	
...
Рейтинг: 0 / 0
19.03.2015, 17:50
    #38910314
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ReadFile и текстовый файл
astrotrainDima T, хорошо, но все равно проблема остается.
Код: plaintext
1.
'void *' : unknown size	

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


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