c++中的.get()在读取文件时是否返回null ?
Does .get() in C++ return null for file reading?
当读取源文件并将单个字符存储到缓冲区中时,.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)
将计算为假?
这是在get
函数的文档中指定的。例如,http://en.cppreference.com/w/cpp/io/basic_istream/get表示:
int_type get();
读取一个字符并在可用时返回。否则,返回
Traits::eof()
并设置failbit
和eofbit
。
您可以检查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背景的影响)
检查流状态是另一个选项(我不会尝试演示)。
相关文章:
- 如何检查 log2 'inbuilt c++ function'是否返回 '-inf'?
- 如何检查 range:: 算法(如 find_if)是否返回了值?
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- 检查成员函数是否返回临时对象或数组对象
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- 地址运算符是否返回变量引用的对象的地址
- 如何检查copy_if是否返回使用ostream_iterator范围内的任何内容
- MMAP是否返回对齐的指针值
- 如何验证 LLVM "ret"指令是否返回 void?
- C++ - 我应该制作“运算符+”常量吗?它是否返回引用
- 为什么主函数不识别其他功能是否返回float类型编号
- 此getter是否返回由构造函数或对班内对象的引用给出的引用?C
- NAN通过指针访问时是否返回false
- 此构造函数是否返回实例
- 如何判断"->"运算符最终是否返回类型?
- QMutexLocker 是否返回错误代码(如果有)
- 检查 Gdiplus::Bitmap::FromFile 是否返回了有效的位图
- 引用数据类型的 & 符号是否返回引用本身的地址或它所引用的值
- 如何使用 if 语句来检查函数是否返回"true"?
- int() 是否返回 0 或任意值