2011-12-20 37 views
-1

私は2つの質問がありますwhileループが終了した後、私は再び「(ライン、中)のgetline」を行う場合のはどうgetline()は実際にどのように動作しますか?

  1. を?

    ifstream in("string.txt"); 
    string s, line; 
    s = ""; 
    while(getline(in,line)) 
    { 
    
        s = s + line + "\n"; 
    
    } 
    
    cout<<s<<endl<<"******************************************"<<endl; 
    
  2. のgetline()関数:毎回、それが呼び出されたが、それは上記のコード内のオブジェクト「の」はifstreamの「次」の行に行くのですか?もしそうなら、whileループが終了し、同じ関数をもう一度呼び出すとどうなりますか? (最初の質問、ちょうど微妙な違いとほぼ同じ)

+0

あなたの質問はあまり明確ではありません。 getlineのリファレンスドキュメントを読んでみてください。あなたがまだ混乱している場合は、質問をより慎重に記述してください。 http://www.cplusplus.com/reference/string/getline/ –

答えて

2

whileループが終了した後、私は再び「(ライン、中)のgetline」を行うと何がsになりますか?

ループは、std::getline()がブール値falseに似た何かを返すと終了します。関数のシグネチャを見ると、ストリームを返すことがわかります。ストリームは、その状態に似ているブール型のようなものへの暗黙的な変換を持っています。 if(stream)がストリームをfalseに評価する場合、ストリームが悪い状態にあることを意味します。これは、EOFフラグセット、エラーフラグの1つ、またはその両方になります。
不良状態のストリームを使用しようとすると失敗します。何も読まれません。

getline()関数:呼び出されるたびに、上記のコードのifstream in "オブジェクトの"次の行に移動しますか?もしそうなら、whileループが終了し、同じ関数をもう一度呼び出すとどうなりますか? (最初の質問とほとんど同じですが、微妙な違いです)

std::getline()とは関係ありません。開いたファイル内の位置は、(ファイル)ストリームのプロパティです。読み込みのためにファイルを開くたびに(位置を設定するための余分なパラメータを渡すことなく)、位置はストリーム(ファイル)の先頭に設定されます。

0

getlineは、改行文字を検出するかストリームの終わりに達するまでストリームを読み取ります。後者の場合、蒸気はフェイルビットが設定されます。 getlineboolにキャストされるストリームへの(参照先)ストリームを返すため、前述のフェイルビットのためにストリームの状態がfalseになるため、この例ではwhileループが破棄されます。

このような状況では、ストリームがまだ「失敗」状態であるため、その後のgetlineの呼び出しは何も行いません。あなたはistream::clearでそれをクリアすることができますが、それ以上のデータがないので、次の読み込み時にフェイルビットを再度設定します。

+0

ストリームの終わりに遭遇したときにフェイルビットが設定されません。これは、getline()の次の**呼び出しの後にそのeofビットが設定されます。 ** PAST **ファイルの終わりを読むまではEOFは設定されません。最後に成功した読み取りはファイルの最後まで読み取られますが、過去は読み取られません。 –

関連する問題