C ++: почему программа читает последний пробел из входного файла как элемент - PullRequest
0 голосов
/ 23 июня 2010

Мой входной файл:

2 5 <-- extra space at the end
4 <--extra space at the end

int main(){
    ifstream input("input.txt");
    istream& in = input;
    string line1;

    while( getline(in,line1)){
        istringstream number1(line1);

        while(number1.good()){
            number1 >> temp1;
            cout<<temp1<<endl;
        }
}
input.close();
}

The problem is with the extra space at the end of the line my output is:
2
5
5
4
4
which is not what i want.. but if i remove the extra space it would work:
2
5
4

Почему это происходит?и как я могу это исправить, чтобы даже с лишними пробелами он читал правильный ввод?Любая помощь будет оценена.Спасибо!

Ответы [ 3 ]

4 голосов
/ 23 июня 2010

Проблема с циклом while (number1.good()).Состояние сбоя number1 не будет устанавливаться до тех пор, пока после извлечения number1 >> temp1 не удастся, но вы не проверяете состояние сбоя до следующего теста состояния цикла, то есть после распечатки.результат этого извлечения.Вам следует изменить внутренний цикл на:

while (number1 >> temp1)
{
    std::cout << temp1 << std::endl;
}

. Это извлечет значение, а затем проверит, успешно ли извлечено и выйдет ли из цикла, если извлечение завершится неудачно, что является желаемым поведением.

3 голосов
/ 23 июня 2010

Попробуйте изменить это:

    while(number1.good()){
        number1 >> temp1;
        cout<<temp1<<endl;
    }

На:

    while (number1 >> temp1)
        cout << temp1 << endl;

и посмотрите, не будет ли это работать лучше.Проблема не в том, что он читает последний пробел как элемент, а в том, что stream.good() остается верным до тех пор, пока после чтения не завершится, поэтому вы выполняете цикл слишком часто.1011 * В качестве альтернативы, замените все на что-то вроде этого:

int main() { 
    ifstream input("input.txt");

    std::copy(istream_iterator<int>(input),
              istream_iterator<int>(),
              ostream_iterator<int>(cout, "\n"));
    return 0;
}
0 голосов
/ 23 июня 2010

Две вещи:

Вы злоупотребляете потоками здесь ИМХО. Нет необходимости во втором потоке. Вы можете просто:

int main()
{
    ifstream input("input.txt");
    string line1;
    int temp1; // <-- you forgot this in your question I believe

    while( in >> temp1 )
    {
        cout<<temp1<<endl;
    }
    input.close();
}

Во-вторых, я думаю, что проблема в вашем вызове number1.good (). это не гарантирует все биты плохого потока. Лучше всего проверять извлечение, используя сам оператор извлечения, как я делал выше.

...