如何知道下一个字符是否是C++中的EOF
How to know if the next character is EOF in C++
我需要知道ifstream
中的下一个字符是否是文件的末尾。我正试着用.peek()
:来做这件事
if (file.peek() == -1)
和
if (file.peek() == file.eof())
但两者都不起作用。有办法做到这一点吗?
编辑:我要做的是在文件中的每个单词的末尾添加一个字母。为了做到这一点,我问下一个字符是否是标点符号,但这样最后一个单词就没有多余的字母了。我只使用char
,而不是string
。
istream::peek()
在检测到文件结尾或错误时返回常量EOF
(不保证等于-1)。要稳健地检查文件结尾,请执行以下操作:
int c = file.peek();
if (c == EOF) {
if (file.eof())
// end of file
else
// error
} else {
// do something with 'c'
}
您应该知道,底层操作系统原语read(2)
只有在您试图读取文件末尾的时才会发出EOF信号。因此,当您只读取文件中的到的最后一个字符时,file.eof()
将不是真的。换句话说,file.eof()
为假并不意味着下一次读取操作将成功。
这应该有效:
if (file.peek(), file.eof())
但是,为什么不在尝试读取有用的数据后检查错误呢?
file.eof()
返回一个标志值。如果您不能再从文件中读取,则设置为TRUE。EOF不是一个实际的字符,它是操作系统的一个标记。所以当你在那里的时候,file.eof()
应该是true
。
所以,在读取(或偷看)之后,应该使用if (true == file.eof())
来检查是否到达文件末尾(如果我理解正确的话,这就是您想要做的),而不是if (file.peek() == file.eof())
。
对于连接到键盘的流,eof条件是我打算在下一次输入时键入Ctrl+D/Ctrl+Z。
peek()
完全看不到。:-)
通常检查我使用的文件结尾:
if(cin.fail())
{
// Do whatever here
}
另一种实现方式是
while(!cin.fail())
{
// Do whatever here
}
其他信息会很有帮助,这样我们就可以知道您想做什么。
无法判断下一个字符是否是文件的结尾,尝试这样做是新的C和C++程序员最常见的错误之一,因为在大多数操作系统中都没有文件的结尾字符。您可以看出,读过流中的当前位置将读过文件末尾,但这通常是非常无用的信息。相反,您应该测试所有读取操作的成功或失败,并根据该状态采取行动。
您没有显示任何正在使用的代码,所以我有一些猜测。在处理流时,通常不需要低级别的设施(如peek()
)。你可能感兴趣的是istream_iterator
。这里有一个例子,
cout << "enter value";
for(istream_iterator<double> it(cin), end;
it != end; ++it)
{
cout << "nyou entered value " << *it;
cout << "nTry again ...";
}
您也可以使用istreambuf_titerator直接处理缓冲区:
cout << "Please, enter your name: ";
string name;
for(istreambuf_iterator<char> it(cin.rdbuf()), end;
it != end && *it != 'n'; ++it)
{
name += *it;
}
cout << "nyour name is " << name;
只需在macosx 中使用此代码
if (true == file.eof())
它在macosx对我有用!
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 使用指针从C++中的数组中获取最大值
- arr[-1]在c++中的奇怪行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 将值指定给向量(2D)的向量中的某个位置
- 内置函数可查看CPP中的成员变量