2010-11-19 4 views
1

Я столкнулся с действительно странной проблемой. Я могу воспроизвести на моем ноутбуке win7, а также на машине ubuntu.Номера C++ cin игнорируют первую строку?

У меня есть C++ программы следующим образом:

#include <string> 
#include <sstream> 
#include <iostream> 
using namespace std; 

int main() { 
    for (int i = 0; i < 9; i++) { 
    string line; 
    getline(cin, line); 
    stringstream ss(line); 

    for (int j = 0; j < 9; j++) { 
     int p = 8; 
     ss >> p; 
     cout << p; 
    } 
    cout << endl; 
    } 
    return 0; 
} 

Теперь, если я скомпилировать его прогон его ./a.out < test.txt где text.txt содержит:

1 2 3 4 5 6 7 8 9 
2 2 3 4 5 6 7 8 9 
3 2 3 4 5 6 7 8 9 
4 2 3 4 5 6 7 8 9 
5 2 3 4 5 6 7 8 9 
6 2 3 4 5 6 7 8 9 
7 2 3 4 5 6 7 8 9 
8 2 3 4 5 6 7 8 9 
9 2 3 4 5 6 7 8 9 

Он будет выводить (без пробелов):

8 8 8 8 8 8 8 8 8 
2 2 3 4 5 6 7 8 9 
3 2 3 4 5 6 7 8 9 
4 2 3 4 5 6 7 8 9 
5 2 3 4 5 6 7 8 9 
6 2 3 4 5 6 7 8 9 
7 2 3 4 5 6 7 8 9 
8 2 3 4 5 6 7 8 9 
9 2 3 4 5 6 7 8 9 

Почему первая линия неправильная? Я тоже пробовал читать первую строку из цикла. Кроме того, если я заменил ss > p на cin > p, я просто получу выходной стол, полный 8-х.

Это не имеет никакого смысла!

Хорошо, вы, ребята, были правы. Некоторые странные вещи в качестве первого символа моего входного файла:

od -c test.txt 
0000000 357 273 277 2  0  5  0  0  7  0 
0000020  0  6 \n 4  0  0  9  6  0 
0000040  0  2  0 \n 0  0  0  0  8 
+1

Возможно, в вашем файле 'test.txt' есть что-то напуганное - может быть, посмотреть на него с помощью шестнадцатеричного редактора? Я получаю содержимое «test.txt» (без пробелов), эхом, когда я компилирую/запускаю с помощью GCC 4.5.1 (MinGW) или с VS2010. –

+0

Я думаю, что есть пустая строка в начале вашего test.txt (или что-то, что не является числовым). –

+0

строки формата лучше! – Svisstack

ответ

1

Это проблема с данными (так как код выглядит нормально). Скорее всего, вы сохранили свой текстовый файл с кодировкой UTF-8 с помощью спецификации. Спецификация UTF-8 имеет три байта в начале файла, и попытка интерпретировать их как спецификацию десятичного числа не удалась.

Вторая, третья, четвертая строка и т. Д. ОК, потому что вы создаете новый объект istringstream для каждой строки, поэтому не сохраняете режим ошибок из предыдущей строки.

Итак, исправить: сохранить файл без спецификации - при условии, что гипотеза спецификации верна.

Приветствия & НТН.,

0

Ваш код кажется нормально для меня, если бы я тебя, я бы перепроверить входной файл: Вы уверены, что нет пустой первой линии, или некоторый нечисловой символ в начале строки 1?

0

Я подозреваю, что вы написали свой собственный getline(), и ошибка есть. В InputStreams есть getline(char*, int), и я подозреваю, что ваш cramming string.begin() в первый парам, а некоторые другие - в последний.

Не делайте этого.

Вся ваша программа должна выполнять копирование ввода на выход (с учетом этого кода и этого ввода). Это тоже не так, даже на линиях, которые «работают».

Я вижу ряд не столь опытных «подписей» программиста. 1) Слишком короткие имена переменных (за пределами счетчика циклов), «ss» и «p» 2) Номер магической ошибки (8), особенно тот, который не выделяется из данных. 3) «Использование»

1 и 3 оба намекают на отсутствие скорости набора текста, и поэтому опыт ... несмотря на вашу репутацию 1k + (которая основана главным образом на задании вопросов ... ситуация становится яснее).

Я бы переписать это что-то вроде этого:

int curDig; 
curLine >> curDig; 
if (curLine.good()) { 
    cout << curDig; 
} else { 
    cout << "FAILED at line: " << lineIdx << " containing: " << line << std::endl; 
} 

Скорее всего, вы будете видеть «FAILED в строке: 0, содержащий:» прямо из ворот, из-за того, что я думаю, ошибка в вашем getline().