c++中的.get()在读取文件时是否返回null ?

Does .get() in C++ return null for file reading?

本文关键字:是否 返回 null 文件 读取 get 中的 c++      更新时间:2023-10-16

当读取源文件并将单个字符存储到缓冲区中时,.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)吗?这是否意味着同样的事情,如果cNULL, if(c)将计算为假?

这是在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 != ''),用于测试您是否刚刚读取了一个空字符。(对于文本输入,您可能永远不会看到空字符;对于二进制输入,空字节并不意味着文件结束)

您需要将get()的结果赋值给int对象,而不是char对象。

关于处理这个问题的最佳方法,意见不一。就我个人而言,我可能会这样写:

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

(这是受我的C背景的影响)

检查流状态是另一个选项(我不会尝试演示)。