Cin числа Cin игнорирует первую строку? - PullRequest
1 голос
/ 20 ноября 2010

Я столкнулся с действительно странной проблемой. Я могу воспроизводить на своем ноутбуке win7, а также на машине с Ubuntu.

У меня есть программа на 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

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

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

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

0 голосов
/ 20 ноября 2010

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

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

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

Я вижу здесь несколько «подписей» не столь опытного программиста.1) Чрезмерно короткие имена переменных (за пределами счетчика цикла for), "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().

0 голосов
/ 20 ноября 2010

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

...