istream::getline
メソッドreturn?
ファイルをループするのを見たので、次のように実行する必要があります。
while ( file.getline( char*, int ) )
{
// handle input
}
何が返されますか?
ストリームを返すので、操作を連鎖させることができます。
ただし、ブールコンテキストでオブジェクトを使用する場合、コンパイラは、オブジェクトをブールコンテキストで使用できる型に変換できる変換演算子を探します。
この場合、ストリームには explicit operator bool() const
があります。呼び出されると、エラーフラグをチェックします。 failbitまたはbadbitのいずれかが設定されている場合はfalseを返し、そうでない場合はtrueを返します。
この場合、ストリームには 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.
}
ストリーム自体を返します。ストリームは(void*
を介して)その状態を示すbool
に変換できます。この例では、ストリームのwhile
への変換が「false」になると、bool
ループが終了します。これは、ストリームがエラー状態になったときに発生します。コードでは、ファイルの終わりを超えて読み取ろうとしたときに発生する可能性が最も高くなります。要するに、それはある限り読み、そして停止するでしょう。
この関数は、ストリームオブジェクト自体への参照を返します。これは、さらに読み取り操作を連鎖させるために使用できます。
myStream.getline(...).getline(...);
または、ループまたは条件で、ストリームが暗黙的にvoid *
sに変換可能であるため:
while (myStream.getline(...)) {
...
}
これについて詳しくは、cplusplus.comWebサイトを参照してください。
誰もがそれが何であるかをあなたに話しました、今私にあなたに言わせてください、 自由形式 バージョンを使用してください
std::string line;
while(getline(file, line)) // assuming file is an instance of istream
{
//
}
なぜこのバージョン?すぐに明らかになるはずです。固定サイズの文字バッファではなく、std::string
を渡します。