-1

どういうわけか、私のfscanfコードが機能しない理由がわかりません。同じ割り当てと同じコードを持つ私の友人は彼のために働いています。

ISBNPrefix::ISBNPrefix(const char * filename) {
    FILE * prefixFile = NULL;

    if (filename != NULL)
    prefixFile = fopen(filename, "r");
}

bool ISBNPrefix::isRegistered (int area) const {
    int areaDigit = 0;
    bool check = false;

    //rewind(prefixFile);

    while(fscanf(prefixFile, "%d %*[^ ] %*[^\n]", &areaDigit) != EOF) {
        if (areaDigit == area) {
            check = true;
            break;
        }
    }

    return check;
}

fscanfが正しく行われず、一部のテストではtrueが返されるはずですが、falseが返されます。正しくスキャンされていないと思います。誰かが何が悪いのかわかりますか?

私のテキストファイルの最初の4行は次のとおりです。

0 00 19
0 200 699
0 7000 8499
0 85000 89999
4

1 に答える 1

2

この行:

while(fscanf(prefixFile, "%d %*[^ ] %*[^\n]", &areaDigit) != EOF) {

意思

  • 数値をareaDigitに読み込み、次に
  • 入力の空白をスキップしてから、
  • 1 つ以上の非スペース文字を読み取り、次に
  • 再び空白をスキップしてから
  • 次の改行までのすべての文字を読み取って破棄します。

の番号を読み取る前にファイルの最後に到達するとareaDigit、ループが終了します。たとえば、次のような入力を使用します。

123 456 789
555 xxx yyy

areaDigitas 123 と 555で 2 回ループします

次のような入力を使用します。

1 2 3 4 5 6 7 8 9
a b c d e f g h i

読み取っ1てから無限ループに入り、2 行目の読み取りに失敗します (areaDigit == 1ずっと)。

次のような入力を使用します。

1
2
3
4
5
6
7

areaDigitas 1、4、および 7 で3 回ループします

于 2013-03-18T18:22:28.887 に答える