从 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++中文件的读取操作,如何读取多行数据,如何一个一个的读取数据