C++:检查 istream 是否有非空格、非制表符、非换行符而未提取字符

标签 c++ iostream

我正在读取一个 std::istream 并且我需要在不提取以下字符的情况下进行验证:

  1. 流不是“空”的,即尝试读取 char 不会导致失败状态(通过使用 peek() 成员函数并检查失败状态,然后设置回原始状态来解决)

  2. 剩下的字符中至少有一个不是空格、制表符或换行符。

这样做的原因是,我正在读取每行包含一个 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/

相关文章:

c++ - auto、decltype(auto) 和尾随返回类型

c++ - 如何将 int 转换为 char*?

c++ - C++ 11 std::chrono::duration 示例

c++ - 带有 const char* 的奇怪 std::cout 行为

c++ - 我对 c++ istream 赋值很好奇

c++ - cout.width 的反转是什么? (C++)

c++ - 用于捕获 10 Gbps NIC 的 libpcap

c++ - std::pow 不返回预期的 int 值

c++ - 为什么 C++ STL iostreams 不是 "exception friendly"?

C++从单词的开头删除非字母字符