如何知道下一个字符在C ++中是否为EOF

问题描述 投票:11回答:8

我需要知道ifstream中的下一个字符是否为文件结尾。我正在尝试使用.peek()

if (file.peek() == -1)

if (file.peek() == file.eof())

但是都行不通。有办法吗?

编辑:我想要做的是在文件中每个单词的末尾添加一个字母。为此,我询问下一个字符是否为标点符号,但是这样就保留了最后一个单词而没有多余的字母。我正在使用char,而不是string

c++ eof
8个回答
23
投票

istream::peek()返回常量istream::peek()(保证not等于-1),当它检测到文件结尾或错误时。要健壮地检查文件结尾,请执行以下操作:

EOF

您应该知道,底层的OS原语int c = file.peek(); if (c == EOF) { if (file.eof()) // end of file else // error } else { // do something with 'c' } 仅在尝试读取past文件末尾时才发出EOF信号。因此,仅读取文件中的最后一个字符时,read(2)将为true。换句话说,read(2)为假并不意味着下一个读取操作将成功。

这应该起作用:

file.eof()

但是为什么不尝试读取有用的数据后仅检查错误?

file.eof()返回标志值。如果无法再从文件中读取,则将其设置为TRUE。 EOF不是实际字符,它是操作系统的标记。因此,当您在那里时-if (file.peek(), file.eof()) 应该为file.eof()

因此,而不是file.eof(),您应该在读取(或窥视)之后具有true来检查是否已到达文件末尾(如果我理解正确,这是您要尝试的工作。)>

对于连接到键盘的流,eof条件是我打算在下一次输入期间键入Ctrl + D / Ctrl + Z。

if (file.peek() == file.eof())完全看不到。 :-)

无法判断下一个字符是否是文件的结尾,而尝试这样做是新的C和C ++程序员犯的最常见错误之一,因为在大多数情况下,没有文件结尾字符操作系统。您可以说的是,读取流中的当前位置将读取文件的末尾,但这通常是非常无用的信息。相反,您应该测试所有读取操作的成功或失败,然后对该状态进行操作。

通常检查我使用的文件结尾:

if (true == file.eof())

另一种实现的方法是..>

peek()

其他信息会有所帮助,所以我们知道您想做什么。

您未显示正在使用的任何代码,因此我有些猜测。使用流时,通常不需要低级功能(例如 if(cin.fail()) { // Do whatever here } )。您可能感兴趣的是 while(!cin.fail()) { // Do whatever here } 。这是一个例子,

peek()

您也可以使用istreambuf_iterator直接在缓冲区上工作:

istream_iterator

仅在macosx中使用此代码

cout << "enter value"; for(istream_iterator<double> it(cin), end; it != end; ++it) { cout << "\nyou entered value " << *it; cout << "\nTry again ..."; }

它在macosx中为我工作!

8
投票
这应该起作用:

2
投票
file.eof()返回标志值。如果无法再从文件中读取,则将其设置为TRUE。 EOF不是实际字符,它是操作系统的标记。因此,当您在那里时-if (file.peek(), file.eof()) 应该为file.eof()

2
投票
对于连接到键盘的流,eof条件是我打算在下一次输入期间键入Ctrl + D / Ctrl + Z。

if (file.peek() == file.eof())完全看不到。 :-)


1
投票
无法判断下一个字符是否是文件的结尾,而尝试这样做是新的C和C ++程序员犯的最常见错误之一,因为在大多数情况下,没有文件结尾字符操作系统。您可以说的是,读取流中的当前位置将读取文件的末尾,但这通常是非常无用的信息。相反,您应该测试所有读取操作的成功或失败,然后对该状态进行操作。

0
投票
通常检查我使用的文件结尾:

if (true == file.eof())


0
投票
您未显示正在使用的任何代码,因此我有些猜测。使用流时,通常不需要低级功能(例如 if(cin.fail()) { // Do whatever here } )。您可能感兴趣的是 while(!cin.fail()) { // Do whatever here } 。这是一个例子,

peek()

您也可以使用istreambuf_iterator直接在缓冲区上工作:

0
投票
仅在macosx中使用此代码

cout << "enter value"; for(istream_iterator<double> it(cin), end; it != end; ++it) { cout << "\nyou entered value " << *it; cout << "\nTry again ..."; }

它在macosx中为我工作!
© www.soinside.com 2019 - 2024. All rights reserved.