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

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

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

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

15.11.2011, 17:55. Просмотров 615. Ответов 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.

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

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

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

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

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

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

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

Пропускает getline - C++
Доброго времени суток. Проблема с getline в строке 33 - компилятор его просто не видит. Думал, что в потоке оставался \n, но ни cin.get(),...

Не работает getline() - C++
Здравствуйте, есть такой код: bool Library::AddNewBook() { bool repeat = true; char answer; std::regex author(AuthorExp); ...

Getline и кириллица - C++
Есть string name;, проблема следующая...работаю с CURL. Формирую POST-запрос, где имеется параметр name. Так вот, если с клавиатуры ввести...

не работает getline - C++
Подскажите, пожалуйста, почему не работает getline? Нужно ввести порядковый номер служащего и его имя с фамилией, но getline пропускает...

не работает getline - C++
Есть код (писал не я), но не могу понять, почему getline() игнорируется в строке 72. Сначала не работало в функции класса, потом решил...

Сложность с getline() - C++
Дорогие форумчане! Возникла сложность при использовании getline(). Допустим, у нас есть такой код: int a,b; string s; cin>>a; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Каратель
Эксперт С++
6552 / 3972 / 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
Ответ Создать тему
Опции темы

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