2016-10-03 6 views
-4

ソースファイルを読み込んで個々の文字をバッファに格納するときに、.get()メソッドはC++でファイルの最後に達したときにNULLを返し、読み込める文字がないことがわかりますか?この場合の.get()メソッドはiostreamライブラリからのものです。C++の.get()はファイルの読み取りにnullを返しますか?

#include <iostream> 
#include <fstream> 
#include <list> 

... 
char c = source_file.get(); 

while(bufferList.size() < MAX_BUFFER_SIZE) 
{ 
    if (c != NULL) 
    { 
     ... // Add chars to buffer. 
    } 
    else // c is Null 
    { 
     bufferList.push_back('$'); 
    } 
    // Get the next char from the file 
    c = source_file.get(); 
} 

ここでは、$を使用してEOFマーカーを象徴しています。

if (c != NULL)の代わりにif(c)と言うことができますか?それは同じことを意味し、cNULLの場合、if(c)はfalseと評価されますか?

+1

'c'はポインタではありません。この場合、デフォルトではint型になります –

+0

source_fileが非常に終わりに達しているかどうかテストするにはどうすればよいですか? – user3869795

+0

'fstat'を呼び出して、' st_size'値を見てから、その数バイトを読み込みます。 –

答えて

4

これは、get関数のドキュメントで指定されています。例えば、http://en.cppreference.com/w/cpp/io/basic_istream/get言います:

int_type get();

は1つの文字を読み込み、利用可能な場合はそれを返します。それ以外の場合はTraits::eof()を返し、failbiteofbitと設定します。

あなたは入力なしで利用可能でしたが、あなただけget()によって返された値をチェックした後、すべてであれば、そうすべき理由を決定するためにfailbitおよび/またはeofbitを確認することができます。

(私はTraits::eof()EOFと同じ値である可能性が非常に高いですが、私はそれのかどうか分からないと推定する。)

NULLがヌルポインタ一定であるので、それはNULLを返しません。 、int値ではありません。さて、実際にはNULL0と定義されていますので、(c != NULL)はコンパイルできますが、あなたが望むことはできません。 (c != '\0')と同じです。これはヌル文字を読み込んだだけであるかどうかをテストします。 (テキスト入力の場合、おそらくヌル文字は表示されません;バイナリ入力の場合、ヌルバイトはファイルの終わりを意味しません)

オブジェクトにはの結果を割り当てる必要があります、charオブジェクトではありません。

これを処理する最善の方法は、意見が異なります。別のオプションは、(私はそれを証明しようとはしません)である(それは私のCの背景の影響を受けています。)ストリームの状態を確認する

int c; 
while ((c = source_file.get()) != EOF) { 
    // ... 
} 

:個人的に私はそうのような何かを書くと思います。

+0

私のifステートメントでは、代わりに 'if(c!= Traits :: eof())'と言って、ステートメントの本文を続行しますか? – user3869795

+0

@ user3869795:私はそう信じています。私はC++の入力には馴染みがありません。また、ループを再編成してget()を呼び出すこともできます。 –

+0

'c!= Traits :: eof()'をチェックしてみたところ、 'Traits not declared'というエラーが出ました。 '.get()'がcharを返す場合、型はなぜ 'int'ですか?私はそれのためのドキュメントを見ていて、それがintであるかもしれないが、charを返す方法を理解していない。 – user3869795

関連する問題