当读取源文件并将各个字符存储到缓冲区时,.get()
方法在C ++中到达文件末尾时返回NULL
并看到没有更多的字符从中读取?在这种情况下,.get()
方法来自iostream
库。
#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)
吗?这是否意味着相同的事情,如果c
是NULL
,if(c)
会评估为假?
答案 0 :(得分:4)
这在get
函数的文档中指定。例如,http://en.cppreference.com/w/cpp/io/basic_istream/get说:
int_type get();
读取一个字符并返回(如果可用)。否则,返回
Traits::eof()
并设置failbit
和eofbit
。
您可以检查failbit
和/或eofbit
以确定为什么没有可用的输入,但是只有在检查返回的值后才应该这样做(如果有的话) get()
。
(我认为Traits::eof()
很可能与EOF
具有相同的价值,但我不确定。{/ p>
它不会返回NULL
,因为NULL
是一个空指针常量,而不是int
值。好吧,实际上NULL
被定义为0
,所以(c != NULL)
可以编译,但它不会做你想要的;它相当于(c != '\0')
,它测试你是否只读取一个空字符。 (对于文本输入,您可能永远不会看到空字符;对于二进制输入,空字节并不意味着文件结束。)
您需要将get()
的结果分配给int
个对象,而不是char
个对象。
至于处理此问题的最佳方式,意见不同。就个人而言,我可能会写一些类似的东西:
int c;
while ((c = source_file.get()) != EOF) {
// ...
}
(这受我的C背景影响。)
检查流状态是另一种选择(我不会试图证明这一点)。