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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dg91
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 4
#1

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

15.11.2011, 17:55. Просмотров 634. Ответов 4
Метки нет (Все метки)

Добрый день!
Помогите, пожалуйста, разобраться с механизмом работы функции 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.

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

Отличие getline() от cin.getline() - C++
Чем отличается getline() от cin.getline() ?

Объясните разницу между "cin.getline" и "std::getline" - C++
string a; cin.getline(a); getline(cin, a);в чем разница между "cin.getline(a);" и "getline(cin, a);"

Getline си++ - C++
Подскажите пожалуйста, в чем причина неправильной работы кода? while(file.getline(name_file, 4, '=')) { ...

getline - C++
Я считываю число из входного потока, но дальше из входного потока уже не могу считать строку. Его надо очищать что ли? #include...

Getline - C++
Доброго времени суток. В чём ошибка? Пишет, что пространство имён "std" не содержит члена "getline". while (!std::getline(file,...

getline - C++
Вот отрывок кода: cout << "Введите тел. работодателя: "; cin.getline(Mobile, 30); group.setMob(Mobile); cout <<...

4
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.11.2011, 18:03 #2
попробуйте так:
C++
1
2
3
4
while(finp.getline(buff, buffLen))
{
  MessageBox(hWnd, buff, "Открытие файла", MB_OK);
}
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2011, 18:09 #3
Считывание из файла
0
dg91
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 4
15.11.2011, 23:09  [ТС] #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;
правда, мессаджБоксы появляются не совсем в том порядке, в котором я думал, что они будут появляться...Но само считывание из файла теперь абсолютно корректно. Если честно, мессаджБоксы появляются в каком-то вообще адском порядке...но это уже другой вопрос. Разберусь.
Всем удачи! Спасибо форуму
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.11.2011, 23:14 #5
dg91,
C++
1
2
3
4
while(!finp.eof())
{
...
}
такой цикл лучше не юзать, в случае ошибки чтения, eof-bit никогда не будет установлен, и цикл станет бесконечным
1
15.11.2011, 23:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 23:14
Привет! Вот еще темы с ответами:

getline - C++
подскажите, в чем проблема, не работает getline, если пишу такой же код в другой программке работает, а тут нет #include<iostream> ...

Getline - C++
Проблема такая: getline не хочет работать так как надо, после строки "Enter the manufacturer: " программа не дает ввести имя и сразу...

getline() - C++
#include <string> #include <iostream> using namespace std ; int main() { string s; cout << "Vvedite frazu: "; ...

использование getline - C++
подскажите , как использовать функцию getline для чтения строки из файла и записи ее в двумерный массив? Добавлено через 5 минут ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru