0
do {
    getline (myfile,temp);
    if (temp[0] != "="){
        MyAlbums[i].tracks.push_back(temp);

    }
    else {
        break;
    }
}while(true);

このエラーが表示されます:

ISO C++ では、ポインターと整数の比較が禁止されています [-fpermissive]

行が "=" 等号文字で始まらない場合、テキスト ファイルと 'push_pack' 内の行をループしようとしています。そうでなければ、ループから抜け出したい。

どんな助けでも大歓迎です!

4

2 に答える 2

6
if (temp[0] != "="){

する必要があります

if (temp[0] != '='){

その理由は、それtemp[0]がタイプであるためですchar( は、読み込んだ文字列であると仮定tempします)。それを stringliteral'='ではなくcharliteral と比較する必要があります"="。正常に読み取れたと想定しているtempため、そうでない場合は確認する必要があるかもしれません。

編集(Adam Lissに感謝)

のような文字列リテラル"="は ( const char *) 型であり、二重引用符で囲まれています。個々の文字は一重引用符で囲みます。charしたがって、 a (charliteral are integers) と を比較することについて、コンパイルに不平を言うメッセージが表示されconst char *ます。

ここからの引用: IBM C++ ドキュメント

C  A character literal has type int.
C++ A character literal that contains only one character has type char, 
which is an integral type.
于 2013-04-20T01:29:08.820 に答える
1

まず、getline成功したことを確認します。boolそれを理解するために、それを ean コンテキストで評価します。

while (getline(myfile, temp)) {
  /* code goes here */
}

それ以外の

do {
  getline(myfile, temp);
  /* code goes here */
} while (true);

すぐに失敗したかどうかを確認せずに入力を行うことは絶対にしないでください。そうしないと、追跡するのに本当に厄介なバグが発生します。

次に、temp少なくとも 1 文字の長さであることを確認してください。 temp.size() >= 1安心してお任せ頂けれtrueばと思いますtemp[0]。長さ 0 の が与えられた場合getline、これを実行すると未定義の動作が発生します。未定義の動作は、ある状況ではまったく無害に動作し、後で予期しない場所で噛まれる可能性があるため、追跡するのは本当に面倒です。stringtemp[0]

第三に、temp[0] != '='の代わりに行うtemp[0] != "="'='は文字、"="は 2 文字のバッファ、最初の文字は'='2 番目の文字は です'\0'。で示される 2 文字の配列は"="、 を実行しようとすると、最初の文字へのポインターに暗黙的に変換され!=、エラーが発生します (文字へのポインターを文字と比較する方法がわからないため)。

于 2013-04-20T01:30:21.483 に答える