2013-04-28 2 views
1

Я пытаюсь понять, почему это сломалось сейчас, потому что я работал, и я не уверен, что не так. Я пытаюсь получить простой getline из файла, который был открыт, однако компилятор продолжает давать мне ошибки. Я пробовал найти кого-то другого с этими проблемами, но я не смог найти кого-то еще с этим. Любой совет?Проблема Getline с открытым файловым потоком

void Foo::bar(ifstream &inputFile) 
{ 
// Read in the data, parse it out, and 
// call loadQueue 
string input; 
do {  
    getline(inputFile, input); 
    loadQueue(input); 
}while (!(inputFile.eof())); 

} 

Вот что я получаю в ответ:

g++ -c -o Airworthy.o Airworthy.cpp 
Foo.cpp: In member function ‘void Airworthy::readData(std::ifstream&)’: 
Foo.cpp:25:27: error: no matching function for call to ‘getline(std::ifstream&, std::string&)’ 
Foo.cpp:25:27: note: candidates are: 
In file included from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/string:55:0, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/locale_classes.h:42, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:43, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40, 

Любые идеи о том, что проблема?

+0

В дополнение к тому, что сказал Энди, вы, вероятно, будете «loadQueue» вызываться для последней строки вашего файла дважды. Измените свой цикл на 'while (getline (inputFile, input)) {loadQueue (input); } '. –

+0

Пожалуйста, покажите нам полное сообщение об ошибке. И для разработки на sftrabbit 'eof()' не возвращает true, когда больше нет ввода, он возвращает true только после того, как * операция ввода уже завершилась с ошибкой из-за eof. – Potatoswatter

+0

@Potatoswatter Или нет. Проблема в том, что вход _until_ не удался, 'eof()' может или не может возвращать 'true'. Прочитав последнюю строку (или последний вход, независимо от того, что она есть), 'eof()' может возвращать либо 'true', либо' false'; вы не можете быть уверены в этом. –

ответ

4

Скорее всего, вы забыли #include все необходимые стандартные заголовки. Одним из возможных вариантов является:

#include <fstream> 

Или, возможно, вы забыли:

#include <string> 

Вы всегда должны #include все соответствующие стандартные заголовки явно, не полагаясь на непрямого включения через некоторые другие заголовки.

+0

Не имеет смысла. Декларация должна быть в '', и это уже упоминается в части диагностического сообщения, которое он нам показал. Вы не можете получить 'std :: string', не получив соответствующую перегрузку' getline'. – Potatoswatter

+0

@Potatoswatter: Я пробовал не '# include'ing' ', и это именно то, что я получаю. –

+0

Ahh, потому что он не знает 'ifstream' происходит от' istream'. Хорошо, +1. Но еще одним решением было бы взять параметр istream &. Обычно параметры 'fstream' являются ошибкой. – Potatoswatter

1

Как говорит Энди, вам нужны соответствующие варианты. Есть, однако, по крайней мере, две другие основные проблемы, связанные с вашим кодом (один из которых будет влиять на который включает в себя вам нужно):

  • Вы никогда не должны (или почти никогда) проходят ifstream как аргумента функция. Если функция не будет делать open или close, вы должны передать ее std::istream&, так что можно назвать любым istream, а не только ifstream.

    После того, как вы изменили это, вам необходимо включить <istream> и не <fstream>. (<fstream> включает <istream>. И много более, которые вам не нужны.)

  • Вы никогда не должны петля на ! inputFile.eof(). Это не работы. В вашем случае петля должна быть

    while (std::getline(inputFile, input)) {4 
        // ... 
    } 
    

    Это работает, и почти ничего не делает.

    В целом, цикл do...while почти всегда ошибочен, когда делает ввод; это приводит к вашей обработке ввода, даже когда не работает (что вы делаете — при любом использовании input после getline, но перед проверкой того, удалось ли - это ошибка). И результаты inputFile.eof() не действительно четко определены, пока вход не вышел из строя. Использование istream::eof() для управления циклом почти всегда является ошибкой.

+0

Эта функция называется через основное приложение после открытия файла. После вызова функции файл затем закрывается. Но я определенно займусь проблемой цикла. Я ценю совет по этому поводу. – johwiltb

+0

@johwiltb Независимо от того, когда вызывается функция, если функция не использует какой-либо интерфейс, который является строго 'ifstream', например' open' и 'close', тогда он должен принимать' istream & ', а не' ifstream & '. На практике это очень распространено для приложения, которое начинается с 'ifstream', только для перехода к некоторому пользовательскому потоку в доме позже; вам не нужно искать каждую функцию, которая читается из потока, и изменять их. –

Смежные вопросы