используя заголовочный файл sstream в C ++ - PullRequest
1 голос
/ 08 сентября 2011

поэтому я пытался использовать istringstream для анализа текстового файла.Идея состоит в том, чтобы разбить каждую строку на пробел и на основе подстроки делать вещи.Код работает нормально, за исключением двух вещей: он дважды подсчитывает последнюю подстроку для каждой строки и вызывает ошибки, когда завершает чтение файла.Раньше я не использовал sstream, поэтому было бы полезно любое понимание.

file.getline(str,80);

    while(!file.eof())

    {

        cout<<str<<endl;
        istringstream iss(str);
        while (iss)
            {
                iss >> sstr;
                cout << "Substring: " <<sstr << endl;
         }
        file.getline(str,80);   
    }

Ответы [ 2 ]

5 голосов
/ 08 сентября 2011

Циклы while должны выглядеть следующим образом:

std::string line;

while (std::getline(file, line))
{
    std::istringstream iss(line);
    std::string token;

    while (iss >> token)
    {
        cout << "Substring: " << token << endl;
    }
}

Операции getline и input возвращают объект потока, который сам по себе имеет специальное преобразование в bool, указывающее, была ли операция выполнена успешно, и она завершится ошибкой точно, когда вы достигнете конца соответствующего потока.

2 голосов
/ 08 сентября 2011

while !eof почти всегда неверно .

Переключитесь на другую книгу C ++ и скажите нам, какую книгу вы сейчас используете, чтобы мы могли насмехаться и предупреждать соответственно.1006 *

while (file.getline(str,80)) {
    cout<<str<<endl;
    istringstream iss(str);
    while (iss >> sstr) {
       cout << "Substring: " <<sstr << endl;
    }
}
...