0

main.cpp でコードを取得しました

cout<<endl<<"Please enter filename: ";
cin.ignore();
getline(cin,fileName);
fin.open(fileName.c_str());
if(fin.is_open())
{

    while(fin.good())
    {
        fin.getline(line,20,',');

        if(!strcmp(line,"Map2D")) 
        {
            cout << "Map 2D" << endl;
        }
        else if(!strcmp(line,"Map3D")) 
        {
            cout << "Map 3D" << endl;
        }
        else if(!strcmp(line,"Dot2D")) 
        {
            cout << "Dot 2D" << endl;
        }
        else if(!strcmp(line,"Dot3D")) 
        {
            cout << "Dot 3D" << endl;
        }

    }
}

これは私のテキストファイルです

Map2D, [3, 8]
Dot3D, [7, 12, 3], [-9, 13, 68]
Map3D, [1, 3, 8]
Dot2D, [5, 7], [3, 8]
Map2D, [6, 2]

しかし、問題は、コンパイルして実行しようとすると、印刷された map2D が保持され、Map3d が cout にさえならないことです。

strcmp の私のロジックに問題がありますか

アップデート:

if(strstr(line,"Map2D") とその作業に変更しました。

助けてくれてありがとう。

4

2 に答える 2

4

あなたgetlineは行を読んでいませんが、次の「、」に遭遇するまで。

つまり、次のことを繰り返します。

Map2D
 [3
 8]\nDot3D
 [7
 12
 3]
 [-9
 13
 68]\nMap3D
...

「Map3D」に等しいトークンをヒットしない理由は簡単にわかるはずです。

ちなみに、貼り付けたコードはコンパイルしたコードではありません。C++ には「elseif」というものはありません。

于 2012-11-14T10:24:46.900 に答える
0

コードにはいくつかの問題があり、そのうちのいくつかは明らかに問題とは無関係ですが、順番に説明します。

  • これcin.ignore()により、ユーザーは余分な空の行を入力する必要があります。

  • while ( fin.good() )確かに間違っています。fin.good()実際、適切な場合はありません。あなたはおそらく while ( fin.getline( line, 20, ',' ) )ここが欲しいでしょう。

  • fin.getline結果を使用する前に、成功したかどうかを確認しません。

  • ループを通過するたびに次のコンマまでしか読み取らないため、入力は、、、、..のようになります"Map2D"" [3"" 8]\nDot3D"" [7"

  • strcmpint平等のために、ではなく、boolを返すので、意図が明示的な難読化でない限り、0書く必要があります。if ( strcmp( line, "..." ) == 0 )(同様に、line コンマ区切りのフィールドが1つしかない場合に入力変数に名前を付けることも、わかりにくくなります。)

このようなことを行う正しい方法は、おそらく std::string、行全体を読み取ってから、任意の数の標準ツールを使用して行自体を解析することです。何かのようなもの:

std::string line;
while ( std::getline( fin, line ) ) {
    std::string label
        = std::string( line.begin(),
                       std::find( line.begin(), line.end(), ',' ) );
    if ( label == "Map2D" ) {
        //  ...
    } else if ( label == "Map3D" ) {
        //  ...
    } // ...
}
于 2012-11-14T10:40:21.080 に答える