Используя заголовочный файл sstream в C++

Поэтому я пытался использовать 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 ответа

Решение

while Циклы должны идти так:

std::string line;

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

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

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

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

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

while (file.getline(str,80)) {
    cout<<str<<endl;
    istringstream iss(str);
    while (iss >> sstr) {
       cout << "Substring: " <<sstr << endl;
    }
}
Другие вопросы по тегам