2

わかりましたので、これは現時点で私を殺しています。これは、私のプログラムの非常に単純な部分であり、動作したくないためです。GA で使用するテキストファイルからデータを読み込んでいます。

最初の getline() は完全に機能しますが、2 番目の getline() は文字列にデータを書き込みたくありません。文字列を数えると、何も表示されません。

コードは次のとおりです。

ifstream inFile;
inFile.open(fname.c_str());
char pop[20], mut[20];

inFile.getline(pop,20);
cout << pop;
inFile.getline(mut,20);
cout << mut; //this outputs nothing

事前に助けてくれてありがとう。私のファイルからのサンプル:それらの間に線はありません突然変異は人口の直後の線です

人口規模: 30
突然変異: 20

4

4 に答える 4

3

ファイルの最初の行は 20 文字 (19 + 新しい行) ですが、19 文字pop[20]しか含めることができません (最後の行はヌル ターミネータ '\0' 用に予約されているため)。

20-1 文字を抽出したために停止した場合istream::getline、改行区切り文字は破棄されません (読み取られなかったため)。したがって、次は最初のgetline行の終わりを読み取り、新しい行を破棄します。

そのため、2 番目の文字列には何も表示されません。

于 2012-11-04T07:50:10.813 に答える
2

問題は、入力行の長さが、それを保持する必要があるバッファーの長さを超えていることです。

解決策は、文字配列を使用しないことです。これは C++std::stringです。

std::ifstream inFile;
inFile.open(fname.c_str());

std::string pop;
std::getline(inFile, pop);
cout << pop << "\n";

std::string mut;
std::getline(inFile, mut);
cout << mut << "\n";
于 2012-11-04T08:53:43.687 に答える
1

何が問題なのかを調べる必要があると思います。呼び出しにエラー チェック コードを追加しgetline、(単純な) コードを (単純な) 関数にリファクタリングし、(単純な) 単体テストを使用します。おそらく、あなたの 2 行目は、想定されている 20 文字よりも長い (ヌル用語を含む!)。

私が何を意味するかについては、このスニペットを見てください。

于 2012-11-04T07:25:39.360 に答える
0

のようなものを試してください

while (getline(in,line,'\n')){
    //do something with line
}

または次のようなものを試してください

string text;
string temp; 
ifstream file;
  file.open ("test_text.txt");

  while (!file.eof())
  {
    getline (file, temp);
    text.append (temp); // Added this line
  }
于 2012-11-04T07:03:01.710 に答える