【问题标题】:How to detect empty lines while reading from istream object in C++?从 C++ 中的 istream 对象读取时如何检测空行?
【发布时间】: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 混合!如果您愿意,可以将其发布为答案,我会接受。

标签: c++ string input stream istream


【解决方案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' 相互转换。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2011-03-16
  • 2014-05-15
  • 1970-01-01
  • 2023-03-24
  • 2011-02-23
相关资源
最近更新 更多