20

メソッドは何istream::getlineを返しますか?

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

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

何が返されますか?

4

5 に答える 5

22

操作を連鎖できるように、ストリームを返します。

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

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.
}
于 2011-01-16T22:17:47.390 に答える
5

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

于 2011-01-16T21:58:02.260 に答える
3

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

于 2011-01-16T21:59:46.423 に答える
2

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

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

または、ストリームは暗黙的にvoid *sに変換可能であるため、ループまたは条件で次のようになります。

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

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

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

于 2011-01-16T21:58:09.110 に答える
0

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

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

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

于 2011-01-16T22:17:00.657 に答える