2011-10-19 5 views
0

は私がstd::istream次の内容(改行が'\n'文字である)を指していると仮定今n == 8C++のgetlineとgcount

std::istream & is = ... 
char buff[9]; 
is.getline(buff, 9); 
int n = is.gcount(); 

をし、 strcmp(buff, "12345678") == 0。問題は、私は行の一部ではなく行全体を読むことをどのように知っていますか?

蒸気の代わりに以下の内容を指している場合:

123456789 
0 

と同じコードが実行され、私は同じ行にはまだしています。これらの2つのケースを区別するにはどうすればよいですか?

答えて

1

あなたの答えの鍵は、reference for getlineによると、それはn - 1文字まで抽出しますあなたの質問

is.getline(buff, 9); 
int n = is.gcount(); 
Now n == 8 

である - あなたのケースでは、8までこれは少し誤解を招く恐れがあり、なぜなら場合n番目の文字は区切り文字で、抽出されます(バッファにはコピーされません)。 n文字に到達する前に、あなたが区切り文字に達していない場合はさらに重要なのは、この作品は関連しています。要するにだから、

If the function stops reading because this size (n) is reached, 
the failbit internal flag is set 

、フェイルビットがセットされている場合は、同じ行にはまだだ(そしてあなたistreamを処理し続けるために状態をクリアする必要があります)。場合によっては、eofも失敗ビットを設定します。したがって、状態がフェイルビットでありフェイルビットであるかどうかをチェックしたいと思うかもしれません:

if (is.rdstate() == std::ios::failbit) { 
    std::cout << "Filled the buffer, but did NOT finish the line\n"; 
    is.clear(); 
} 
+0

'&'でなく '=='でなければなりませんか? –

+0

私は最初に '&'を持っていましたが、 '=='に変更しました。フェイルビットが他の状況(例えば、eof)で設定される可能性もあり、eofbitも設定されます。ですから、ここでは '=='が正しい選択だと思います。 – Tim

3

使用std::stringと自由std::getline機能:

#include <istream> 
#include <string> 

// ... 

std::istream & is = ...; 
std::string line; 

while (std::getline(is, line)) 
{ 
    // process line 
} 
0

は、次の文字を読みます。改行の場合は、その行のすべてのデータを読み込んでいます。

ところで、よく使われるのは、改行までの行全体をstd::stringに読み込んで処理することです。