web-dev-qa-db-ja.com

istream :: getlineの戻り値の型

istream::getlineメソッドreturn?

ファイルをループするのを見たので、次のように実行する必要があります。

while ( file.getline( char*, int ) )
{
    // handle input
}

何が返されますか?

19
user542687

ストリームを返すので、操作を連鎖させることができます。

ただし、ブールコンテキストでオブジェクトを使用する場合、コンパイラは、オブジェクトをブールコンテキストで使用できる型に変換できる変換演算子を探します。

C++ 11

この場合、ストリームには explicit operator bool() const があります。呼び出されると、エラーフラグをチェックします。 failbitまたはbadbitのいずれかが設定されている場合はfalseを返し、そうでない場合はtrueを返します。

C++ 03

この場合、ストリームには operator void*() const があります。これによりポインタが生成されるため、ブールコンテキストで使用できます。呼び出されると、エラーフラグをチェックします。 failbitまたはbadbitのいずれかが設定されている場合は、FALSEと同等のNULLを返します。それ以外の場合は、selfへのポインターを返します(または、この事実を使用しないでください)。

使用法

したがって、ブールテストを必要とする任意のコンテキストでストリームを使用できます。

if (stream >> x)
{    
}

while(stream)
{
    /* do Stuff */
}

注:ストリームを外部でテストしてから、条件付き/ループステートメントの本体の内部で読み取り/書き込みを行うことはお勧めできません。これは、読む行為によってストリームが悪くなる可能性があるためです。通常は、テストの一部として読み取りを行うことをお勧めします。

while(std::getline(Steam, line))
{
    // The read worked and line is valid.
}
19
Martin York

参照 から見てください。 getlineから返されたistreamは、操作の成功を確認するために 暗黙の変換 によってboolに変換されます。この変換により、if(mystream.getline(a,b))の使用法がif(!mystream.getline(a,b).fail())の省略形になります。

5
Öö Tiib

ストリーム自体を返します。ストリームは(void*を介して)その状態を示すboolに変換できます。この例では、ストリームのwhileへの変換が「false」になると、boolループが終了します。これは、ストリームがエラー状態になったときに発生します。コードでは、ファイルの終わりを超えて読み取ろうとしたときに発生する可能性が最も高くなります。要するに、それはある限り読み、そして停止するでしょう。

この関数は、ストリームオブジェクト自体への参照を返します。これは、さらに読み取り操作を連鎖させるために使用できます。

myStream.getline(...).getline(...);

または、ループまたは条件で、ストリームが暗黙的にvoid *sに変換可能であるため:

while (myStream.getline(...)) {
    ...
}

これについて詳しくは、cplusplus.comWebサイトを参照してください。

http://cplusplus.com/reference/iostream/istream/getline/

2
templatetypedef

誰もがそれが何であるかをあなたに話しました、今私にあなたに言わせてください、 自由形式 バージョンを使用してください

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream
{
//
}

なぜこのバージョン?すぐに明らかになるはずです。固定サイズの文字バッファではなく、std::stringを渡します。

0
Nim