我需要知道ifstream
中的下一个字符是否是文件的结尾。我正在尝试使用.peek()
:
if (file.peek() == -1)
和
if (file.peek() == file.eof())
但两者都不起作用。有办法做到这一点吗?
编辑:我要做的是在文件中的每个单词的末尾添加一个字母。为了做到这一点,我问下一个字符是否是标点符号,但是这样最后一个字就没有多余的字母了。我只使用char
,而不是string
。
答案 0 :(得分:22)
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()
为假并不意味着下一个读取操作将成功。
答案 1 :(得分:8)
这应该有效:
if (file.peek(), file.eof())
但为什么不尝试读取有用的数据后检查错误?
答案 2 :(得分:2)
对于连接到键盘的流,eof条件是我打算在下一次输入时键入Ctrl + D / Ctrl + Z.
peek()
完全看不到。 : - )
答案 3 :(得分:1)
file.eof()
返回一个标志值。如果您无法再从文件中读取,则将其设置为TRUE。 EOF不是实际角色,它是操作系统的标记。所以当你在那里时,file.eof()
应该是true
。
因此,在阅读(或查看)之后,您应该if (file.peek() == file.eof())
而不是if (true == file.eof())
来检查您是否到达文件末尾(如果我理解的话,那就是您要做的事情)正确地)。
答案 4 :(得分:1)
无法确定下一个字符是否是文件的结尾,并且尝试这样做是新C和C ++程序员犯下的最常见错误之一,因为文件中没有文件结尾符号大多数操作系统。您可以看出,读取流中的当前位置将读取文件末尾,但这通常是无用的信息。您应该测试所有读取操作的成功或失败,并根据该状态进行操作。
答案 5 :(得分:0)
通常检查我使用的文件结尾:
if(cin.fail())
{
// Do whatever here
}
实现这种方式的另一种方式是..
while(!cin.fail())
{
// Do whatever here
}
其他信息会有所帮助,因此我们知道您想要做什么。
答案 6 :(得分:0)
你没有显示你正在使用的任何代码,所以我有一些猜测。使用流时,通常不需要低级设施(如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_iterator直接处理缓冲区:
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;
答案 7 :(得分:0)
只需在macosx中使用此代码
if (true == file.eof())
它在macosx中对我有用!