Форум программистов, компьютерный форум CyberForum.ru

Помогите с getline - C++

Восстановить пароль Регистрация
 
dg91
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 4
15.11.2011, 17:55     Помогите с getline #1
Добрый день!
Помогите, пожалуйста, разобраться с механизмом работы функции getline класса ifstream.
Есть кусок кода:
C++
1
2
3
4
5
6
7
8
int buffLen = 10;
char* buff = new char[buffLen];
while(!finp.eof())
{
  finp.getline(buff, buffLen);
  MessageBox(hWnd, buff, "Открытие файла", MB_OK);
}
delete[] buff;
Дело в том, что если длина строки в текстовом файле превышает (buffLen - 1) символов, что эта строка будет считана, а остальные - нет. Почему-то начинается бесконечный цикл, а на в messageBox отображается пустая строка. Длина последующих прочитанных строк - 0.

Объясните, почему так происходит?
Ведь функция должна читать либо до конца строки, либо до конца файла, либо указанное количество символов.
И как написать код, который выполнялся бы корректно независимо от длины строк в текстовом файле?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 17:55     Помогите с getline
Посмотрите здесь:

Строка getline() C++ C++
getline C++
помогите разобратся с getline C++
getline C++
getline C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.11.2011, 18:03     Помогите с getline #2
попробуйте так:
C++
1
2
3
4
while(finp.getline(buff, buffLen))
{
  MessageBox(hWnd, buff, "Открытие файла", MB_OK);
}
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2011, 18:09     Помогите с getline #3
Считывание из файла
dg91
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 4
15.11.2011, 23:09  [ТС]     Помогите с getline #4
Net_Wanderer
спасибо, в вашем варианте зацикливания не происходит. Оно и понятно. Строки getline не читает, => цикл завершается.
Но мне было непонятно, почему не происходит дальнейшее чтение файла?
То есть при прочтении строки, следующей за строкой длины большей, чем (buffLen - 1), функция возвращает 0. Почему?

Разобрался, найдя более полную документацию по классу ifstream.

Оказывается, в случае недостаточной длины буфера функция getline выставляет внутренний флаг ios::failbit. Сбросить его можно с помощью метода clear().

Все=)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int buffLen = 10;
char* buff = new char[buffLen];
while(!finp.eof())
{
  finp.getline(buff, buffLen);
  MessageBox(hWnd, buff, "Показываем строку", MB_OK);
  ios::iostate i;
  i = finp.rdstate();
  if(i & ios::failbit)
  {
    MessageBox(hWnd, "Выставлен бит поправимой ошибки", "Бит установлен", MB_OK);
    //сбрасываем этот бит
    finp.clear();
  }
  if(!(i & ios::failbit))
  {
    MessageBox(hWnd, "Бит поправимой ошибки был сброшен", "Бит сброшен", MB_OK);
  }
}
delete[] buff;
правда, мессаджБоксы появляются не совсем в том порядке, в котором я думал, что они будут появляться...Но само считывание из файла теперь абсолютно корректно. Если честно, мессаджБоксы появляются в каком-то вообще адском порядке...но это уже другой вопрос. Разберусь.
Всем удачи! Спасибо форуму
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.11.2011, 23:14     Помогите с getline #5
dg91,
C++
1
2
3
4
while(!finp.eof())
{
...
}
такой цикл лучше не юзать, в случае ошибки чтения, eof-bit никогда не будет установлен, и цикл станет бесконечным
Yandex
Объявления
15.11.2011, 23:14     Помогите с getline
Ответ Создать тему
Опции темы

Текущее время: 03:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru