C ++中的.get()是否为文件读取返回null?

时间:2016-10-03 19:06:45

标签: c++

当读取源文件并将各个字符存储到缓冲区时,.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)吗?这是否意味着相同的事情,如果cNULLif(c)会评估为假?

1 个答案:

答案 0 :(得分:4)

这在get函数的文档中指定。例如,http://en.cppreference.com/w/cpp/io/basic_istream/get说:

  

int_type get();

     

读取一个字符并返回(如果可用)。否则,返回Traits::eof()并设置failbiteofbit

您可以检查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背景影响。)

检查流状态是另一种选择(我不会试图证明这一点)。