2016-10-03 69 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