我正在读取一个 std::istream 并且我需要在不提取以下字符的情况下进行验证:
流不是“空”的,即尝试读取 char 不会导致失败状态(通过使用 peek() 成员函数并检查失败状态,然后设置回原始状态来解决)
剩下的字符中至少有一个不是空格、制表符或换行符。
这样做的原因是,我正在读取每行包含一个 int 的文本文件,有时文件末尾可能会有额外的空格/换行符,这会在我尝试取回数据从文件到一个 int vector 。
peek(int n) 可能会满足我的需要,但我坚持执行它。 我知道我可以像这样阅读 istream:
while (myInt << myIstream) {…} //Will fail when I am at the end
但是相同的检查会在许多不同的条件下失败(比如我在某行上有一些不是 int 的东西)并且能够区分两个读取错误(意外的东西,什么都没有)会帮助我编写更健壮的代码,如我所写:
while (something_left(myIstream)) {
myInt << myIstream;
if (myStream.fail()) {…} //Horrible things happened
}
谢谢!
最佳答案
有一个名为 ws 的函数会吃掉空格。也许你可以在每次阅读后调用它。如果它命中 eof,那么你就知道你有一个正常的终止。如果没有,并且下一次读取没有产生有效的 int,那么您就知道文件中有垃圾。也许是这样的:
#include <fstream>
#include <iostream>
int main()
{
std::ifstream infile("test.dat");
while (infile)
{
int i;
infile >> i;
if (!infile.fail())
std::cout << i << '\n';
else
std::cout << "garbage\n";
ws(infile);
}
}
关于C++:检查 istream 是否有非空格、非制表符、非换行符而未提取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913919/