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

При считывании из файла последний элемент читается дважды - C++

Восстановить пароль Регистрация
 
Kapex
15 / 15 / 4
Регистрация: 11.11.2014
Сообщений: 118
19.07.2015, 20:47     При считывании из файла последний элемент читается дважды #1
Всем доброго времени суток!

Нашёл граблю. Считываю из файла слова, разделённые пробелами, в vector<string>. Для куска кода, которые по моему разумению должны работать одинаково, выдают разный ответ.
Кусок 1:
C++ (Qt)
1
2
3
4
string temp;
vector<string> a;
while (infile >> temp)
         a.push_back(temp);
Выдаёт правильный ответ

Код 2:
C++ (Qt)
1
2
3
4
5
6
string temp;
vector<string> a;
while (!infile.eof()){
         infile >> temp;
         a.push_back(temp);
}
Выдаёт на 1 больше, причём повторяет последний элемент.

Как так? Где я обманываюсь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.07.2015, 21:12     При считывании из файла последний элемент читается дважды #2
C++
1
2
3
4
5
string temp;
vector<string> a;
while (infile >> temp){
         a.push_back(temp);
}
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
19.07.2015, 21:17     При считывании из файла последний элемент читается дважды #3
Во втором случае
infile >> temp;
последний раз читает за концом файла.
Однако в этот момент проверки нет и
a.push_back(temp);
запихивает еще раз последний элемент.
Правильней будет так
C++
1
2
3
4
5
6
7
8
9
string temp;
vector<string> a;
while (true)
{
   infile >> temp;
   if(!infile)
       break;
   a.push_back(temp);
}
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
19.07.2015, 21:17     При считывании из файла последний элемент читается дважды #4
Цитата Сообщение от Kapex Посмотреть сообщение
Как так? Где я обманываюсь?
Вы считаете что оба кода эквивалентны,это не так.Во втором случае,после прочтения последней строки, в infile eof не будет установлен.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
20.07.2015, 08:14     При считывании из файла последний элемент читается дважды #5
Цитата Сообщение от zss Посмотреть сообщение
Правильней будет так
Или так:
C++
1
2
3
4
5
6
string temp;
vector<string> a;
if(infile >> temp)
    do {
        a.push_back(temp);
    } while (infile >> temp);
Yandex
Объявления
20.07.2015, 08:14     При считывании из файла последний элемент читается дважды
Ответ Создать тему
Опции темы

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