2016-09-30 4 views
0

C++でファイルを読み込むときに、どのようにEOFを通知するのですか?私は、ファイルを読み込んでそれを言語のトークンに分割するコンパイラデザインの一環として、直接コード化されたスキャナを作成しています。プログラムが開くファイルにEOFを通知する方法

私はプログラム全体を読み、コメントを取り除き、空白を圧縮します。次に、得られたプログラムcharをcharで最大1024文字のバッファに入れます。だから私たちが空になったら、バッファーを補充するか、そうでないものを補充します。私は、この書かれているファイルを開くには

:バッファを満たすために

// Open source file. 
source_file.open (filename); 
if (source_file.fail()) { 
    // Failed to open source file. 
    cerr << "Can't open source file " << *filename << endl; 
    buffer_fatal_error(); 

を、私は、whileループを使用して

int i = 0; 
// Iterate through the whole file 
while(source_file.at(i) != EOF) 
{ 
    // If not a tab or newline add to buffer 
    if (source_file.at(i) != "\n" || source_file.at(i) != "\t") 
    { 
     bufferList.add(source_file.at(i)); 
    } 
    i++; 
} 

のように反復したいと思っています知らせるための方法が存在することになります私が開いているファイルのようなEOF?

これは多かれ少なかれ、何をすべきかの概要です。私が空になったらバッファを補充する方法やデュアルバッファリングを使う方法を理解する必要があります。私はまた、#で始まるコメントを取り除く方法を理解する必要があります。例えば、# This is a comment。私のスキャナでは#が表示され、それ以降はすべて次の改行文字が得られるまで削除されます。データを読み出すための標準的な方法はwhileループにおける読み出し動作の結果をテストすることである

char c; 
std::vector<char> buffer(1024); 
while (source_file.get(c)) 
{ 
    if ((c != '\n') || (c != '\t')) 
    { 
    buffer.push_back(c); 
    } 
} 

+0

EOFは、ファイルの末尾にヌル値を探していることを意味しています。 –

+0

バッファーに 'std :: vector 'を使用し、バッファーにデータを読み込む 'istream :: read()'を試してください。 –

+0

@ThomasMatthewsは 'istream :: read()'で空白を取り除きますか? – GenericUser01

答えて

0

はこれを試してみてください。

は、ブロック読み出しのために、あなたはこのような何かを行うことができ:あなたはまた、ファイルから読み込んだ文字の数を取得するためにstd::istream::gcount()を使用する必要があります

char buffer[1024]; 
while (source_file.read(buffer, sizeof(buffer)) 
{ 
    // Process the buffer here 
} 

、それがバッファサイズよりも小さくなる可能性があるので。

+0

私はこの回答の上部を理解しています。しかし、 'source_file.get(c)'と 'source_file.at(c)'と比べて違いがあるのでしょうか、それとも同じですか?私はちょうど 'read'が何をしているのか、それを使ってコメントを取り除き、空白を圧縮する方法を混乱させていると思います。 – GenericUser01

+0

申し訳ありませんが、['std :: istream'](http://en.cppreference.com/w/cpp/io/basic_istream)の' at() 'メソッドは表示されません。 –

関連する問題