从 C++ 中的 istream 对象读取时如何检测空行?

Posted

技术标签:

【中文标题】从 C++ 中的 istream 对象读取时如何检测空行?【英文标题】:How to detect empty lines while reading from istream object in C++? 【发布时间】:2012-03-03 08:46:57 【问题描述】:

如何检测一行是否为空?

我有:

1
2
3
4

5

我正在使用 istream r 阅读此内容 所以:

int n;
r >> n

我想知道我什么时候到达 4 到 5 之间的空间。 我尝试读取为 char 并使用 .peek() 来检测 \n 但这会检测到数字 1 之后的 \n 。上述输入的翻译是:1\n2\n3\n4\n\n5\n 如果我是正确的...

因为我要操作整数,所以我宁愿将它们读取为整数,而不是使用 getline 然后转换为整数...

【问题讨论】:

¤ 使用std::getline 将每一行读入std::string。检查字符串长度。使用例如std::istringstream 从输入行中读取单个项目。这也将帮助您处理错误的输入。干杯&hth., 哦,我刚看到最后一段,意译为“我不想用最简单最合理的方式”。在这种情况下,实际上有无数种更复杂的方法。只有一个人的想象力才能限制以愚蠢复杂的方式做某事的方式。干杯, 好吧,你不必无礼。至少我在发布之前尝试了不同的方法。我只是想知道是否有另一种方式。我只是在学习 c++ atm。不过,感谢 istringstream 的评论,我将尝试将它与 getline 混合!如果您愿意,可以将其发布为答案,我会接受。 【参考方案1】:

它可能看起来像这样:

#include <iostream>
#include <sstream>
using namespace std;

int main()

    istringstream is("1\n2\n3\n4\n\n5\n");
    string s;
    while (getline(is, s))
    
        if (s.empty())
        
            cout << "Empty line." << endl;
        
        else
        
            istringstream tmp(s);
            int n;
            tmp >> n;
            cout << n << ' ';
        
    
    cout << "Done." << endl;
    return 0;

输出:

1 2 3 4 Empty line.
5 Done.

希望这会有所帮助。

【讨论】:

我确实需要了解空行,因为输入被由该空格分隔的块划分。而且我需要知道哪些数据进入了哪个块。 @bb2 :在这种情况下,我肯定会使用std::getline 将每一行读取为string。然后您可以根据该字符串创建临时的istringstream 并从中读取。我已经编辑了我的答案。 我刚刚注意到 Alf P. Steinbach 在评论您的问题时也推荐了该解决方案。 失败:您正在报告一个额外的空行。这样做while (is.good()) 实际上总是错误的,而且在这里绝对是错误的。使用while(getline(is, s)) @LokiAstari:你是对的,它好多了。谢谢,我已经编辑了我的答案。【参考方案2】:

如果你真的不想使用 getline,这段代码可以工作。

#include <iostream>
using namespace std;


int main()

    int x;
    while (!cin.eof())
    
        cin >> x;
        cout << "Number: " << x << endl;

        char c1 = cin.get();
        char c2 = cin.peek();

        if (c2 == '\n')
        
            cout << "There is a line" << endl;
        
    

但请注意,这是不可移植的。当您使用具有与 '\n' 不同的结束行字符的系统时,就会出现问题。考虑读取整行,然后从中提取数据。

【讨论】:

这不是便携式的。系统的换行符与 '\n' 相互转换。

以上是关于从 C++ 中的 istream 对象读取时如何检测空行?的主要内容,如果未能解决你的问题,请参考以下文章

C++中文件的读取操作,如何读取多行数据,如何一个一个的读取数据

如何将 IStream 实例中的数据读入 char 指针?

调用'get'和'peek'时阻止c ++ istream锁定

如何将 istream 传递给 c++ 中的函数?

C++面试题

C++中怎么逐行读取数据