1

string'sこれは、ファイル内の存在を確認するために私が書いたコードです。

bool aviasm::in1(string s)
{
ifstream in("optab1.txt",ios::in);//opening the optab
//cout<<"entered in1 func"<<endl;
char c;
string x,y;
while((c=in.get())!=EOF)
{
    in.putback(c);
    in>>x;
    in>>y;
    if(x==s)
    return true;
}
return false;
}

検索される文字列がの最初の列にあることは確かでありoptab1.txt、合計でoptab1.txtすべての行のに2つの列があります。ここで問題となるのはs、関数へのパラメーターとして渡される文字列に関係なく、常にfalseが返されることです。なぜこれが起こるのか教えていただけますか?

4

2 に答える 2

5

なんてハック!標準のC++文字列およびファイル読み取り関数を使用してみませんか。

bool find_in_file(const std::string & needle)
{
  std::ifstream in("optab1.txt");
  std::string line;

  while (std::getline(in, line))  // remember this idiom!!
  {
    // if (line.substr(0, needle.length()) == needle)  // not so efficient
    if (line.length() >= needle.length() && std::equal(needle.begin(), needle.end(), line.begin())) // better
    // if (std::search(line.begin(), line.end(), needle.begin(), needle.end()) != line.end())  // for arbitrary position
    {
      return true;
    }
  }
  return false;
}

substr検索文字列を行の先頭に置く必要がない場合は、より高度な文字列検索関数に置き換えることができます。バージョンは最もsubstr読みやすいですが、部分文字列のコピーを作成します。このequalバージョンでは、2つの文字列をインプレースで比較します(ただし、追加のサイズチェックが必要です)。このsearchバージョンでは、行の先頭だけでなく、どこでも(価格で)部分文字列が見つかります。

于 2011-09-23T16:14:43.803 に答える
1

あなたが何をしようとしているのかはあまり明確ではあり whileませんが、plaincharが署名されていない場合、の条件は決して満たされません。(通常はそうではないので、それでうまくいくかもしれません。)また、ループ内の行末を抽出していないので、おそらく、の代わりにそれが表示EOFされ、ループ内を頻繁に通過します。私はこれを次のようにもっと書きます:

bool
in1( std::string const& target )
{
    std::ifstream in( "optab1.txt" );
    if ( ! in.is_open() )
        //  Some sort of error handling, maybe an exception.
    std::string line;
    while ( std::getline( in, line )
            && ( line.size() < target.size() 
                 || ! std::equal( target.begin(), target.end(), line.begin() ) ) )
        ;
    return in;
}

オープンが成功したことを確認してください。常にfalseを返す理由の1つは、ファイルを正常に開いていないことです。(ただし、開店後の状況を確認しないとわかりません。)

于 2011-09-23T16:47:50.190 に答える