如何解决为什么我的 getline() 不读取文件的空行?
我正在编写一个函数来读取文件并显示除空行之外的每一行。但是,当我尝试避免出现空行时,显示内容仍然包含每个空行。我的代码有什么问题?
ifstream rfile;
int lineNum{};
rfile.open(inputFilePath);
for (string line; getline(rfile,line);) {
lineNum++;
if (line.empty())
cerr << "Line " << lineNum << " is empty." << '\n';
else
cout << lineNum << ": " << line << '\n';
}
输入文件包含:
10* 8
44 - 88
12 + 132
70 / 7
新增了 3 行。但我的输出是:
1:
2:
3: 10* 8
4: 44 - 88
5: 12 + 132
6: 70 / 7
7:
为什么新行仍然显示?
我只是像@prehistoricpenguin 所说的那样更改了 cout << lineNum << ": " << line << '\n'; into cout << lineNum << ": " << line << ":" << line.length() << '\n';
。
然后输出变成了:
:1
:1
:6
:8
:9
:7
:1
另外,我打开了“show whitesapce”。在我的输入文件中,它没有显示点或空格。但是在运行程序时,会出现点(空格)。
解决方法
您的结果与使用 CRLF 样式 (\r\n
,0x0D 0x0A
) 换行符的文本文件一致,但您的代码使用的是仅识别 LF 样式的 std::getline()
实现(\n
,0x0A
) 换行符,因此在输出字符串中留下 \r
。这就是为什么每个 length()
的 line
比您预期的多 1 个字符。
您需要在每次 \r
调用后检测并截断额外的 std::getline()
字符,例如:
ifstream rfile;
int lineNum{};
rfile.open(inputFilePath);
for (string line; getline(rfile,line);) {
lineNum++;
if ((!line.empty()) && (line.back() == '\r'))
line.resize(line.size()-1);
if (line.empty())
cerr << "Line " << lineNum << " is empty." << '\n';
else
cout << lineNum << ": " << line << '\n';
}
,
这适用于 MSVC 的输出:
Line 1 is empty.
Line 2 is empty.
3: 10* 8
4: 44 - 88
5: 12 + 132
6: 70 / 7
Line 7 is empty.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。