2016-10-03 68 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)?這是否意味着同樣的事情,如果cNULLif(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();

讀取一個字符,如果可用返回。否則,返回Traits::eof()並設置failbiteofbit

您可以檢查failbit和/或eofbit確定爲什麼沒有輸入可用,但如果有的話,檢查由get()返回的值後,只有你應該這樣做。

(我假定Traits::eof()很可能是相同的值EOF,但我不能肯定這一點。)

不退還NULL,因爲NULL是一個空指針不斷 ,而不是int的值。那麼,實際上NULL被定義爲0,所以(c != NULL)可以編譯,但它不會做你想要的;它相當於(c != '\0'),它測試您是否只讀取空字符。 (對於文本輸入,你可能永遠不會看到一個空字符;對於二進制輸入,一個空字節並不意味着最終的文件。)

而你需要的get()結果分配給一個int對象,而不是一個char對象。

至於處理這個問題的最佳方法,意見不同。我個人倒有可能寫類似:

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

(這是由我的C背景的影響。)

檢查流狀態是另一種選擇(我不會試圖證明)。

+0

在我的if語句中,我會改爲'if(c!= Traits :: eof())',然後繼續聲明的主體? – user3869795

+0

@ user3869795:我相信如此。我對C++輸入的瞭解不夠確定。你可以重組你的循環,所以只有一個調用get()。 –

+0

我試着檢查'c!= Traits :: eof()'並得到一個錯誤,說'Traits還沒有被聲明。如果'.get()'返回一個字符,爲什麼類型是'int'呢?我正在查看它的文檔,不明白它是如何可以是一個整數,但它返回一個字符。 – user3869795