我需要知道ifstream
中的下一个字符是否为文件结尾。我正在尝试使用.peek()
:
if (file.peek() == -1)
和
if (file.peek() == file.eof())
但是都行不通。有办法吗?
编辑:我想要做的是在文件中每个单词的末尾添加一个字母。为此,我询问下一个字符是否为标点符号,但是这样就保留了最后一个单词而没有多余的字母。我正在使用char
,而不是string
。
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
来检查是否已到达文件末尾(如果我理解正确,这是您要尝试的工作。)>
if (file.peek() == file.eof())
完全看不到。 :-)
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中为我工作!
file.eof()
返回标志值。如果无法再从文件中读取,则将其设置为TRUE。 EOF不是实际字符,它是操作系统的标记。因此,当您在那里时-if (file.peek(), file.eof())
应该为file.eof()
。if (file.peek() == file.eof())
完全看不到。 :-)
if (true == file.eof())
if(cin.fail())
{
// Do whatever here
}
)。您可能感兴趣的是 while(!cin.fail())
{
// Do whatever here
}
。这是一个例子,peek()
您也可以使用istreambuf_iterator直接在缓冲区上工作:
cout << "enter value";
for(istream_iterator<double> it(cin), end;
it != end; ++it)
{
cout << "\nyou entered value " << *it;
cout << "\nTry again ...";
}
它在macosx中为我工作!