1

私は本当に奇妙な問題に遭遇しました。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.txttext.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 > pcin > 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
4

3 に答える 3

1

これはデータの問題です (コードは問題ないように見えるため)。ほとんどの場合、BOM 付きの UTF-8 エンコードでテキスト ファイルを保存しています。UTF-8 BOM はファイルの先頭にある 3 バイトであり、これらを 10 進数の指定として解釈しようとすると失敗します。

istringstream2行目、3行目、4行目など。行ごとに新しいオブジェクトを作成しているため、前の行のエラーモードを保持しないため、OKです。

BOM 仮説が正しいと仮定して、BOM なしでファイルを保存します。

乾杯 & hth.,

于 2010-11-19T23:04:40.527 に答える
0

あなたが自分getline()で書いたのではないかと思いますが、そこにバグがあります。InputStreams には があり、最初のパラメーターに詰め込み、後者にその他の数値を詰め込んでいるgetline(char*, int)と思われます。string.begin()

そうしないでください。

プログラムが行うべきことは、入力を出力にコピーすることだけです (このコードとその入力が与えられた場合)。「機能する」行であっても、それは行っていません。

ここには、経験の浅いプログラマーの「署名」が多数見られます。1) 過度に短い変数名 (for ループ カウンターの外側)、"ss" および "p" 2) マジック エラー番号 (8)、特にデータから目立たないもの。3)「使う」

1 と 3 はどちらもタイピング速度の不足を示唆しているため、経験は... 1,000 以上の評判にもかかわらず (これは主に質問をすることに基づいています... 状況はより明確になります)。

私はそれを次のように書き直します:

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

おそらく、「FAILED at line: 0 contains:」がすぐに表示される可能性があります。これは、 getline().

于 2010-11-19T23:07:34.587 に答える
0

あなたのコードは私には問題ないようです。もし私があなただったら、入力ファイルを再確認します。空の最初の行や、行 1 の先頭に数値以外の文字がないことを確認しますか?

于 2010-11-19T22:49:10.127 に答える