微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的 getline() 不读取文件的空行?

如何解决为什么我的 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 举报,一经查实,本站将立刻删除。