gpt4 book ai didi

c++ - getline() 设置故障位并跳过最后一行

转载 作者:行者123 更新时间:2023-12-01 22:49:21 26 4
gpt4 key购买 nike

我正在使用 std::getline() 枚举文件中的行,并且它大部分工作正常。然而,这让我很好奇 - std::getline() 正在跳过文件中的最后一行,但前提是它是空白的。使用这个最小的例子:

#include <iostream>
#include <string>

int main()
{
std::string line;
while(std::getline(std::cin, line))
std::cout << "Line: “" << line << "”\n";
return 0;
}

如果我喂它这个:

Line A
Line B
Line C

我把这些台词又带回来了。但这:

Line A
Line B
Line C
[* line is present but blank, ie, the file end is: "...B\nLine C\n" *]

(不幸的是,我在SO的小代码框里不能有空行......)因此,第一个文件有三行( ["Line A", "Line B", "Line C"] ),第二个文件有四行( ["Line A", "Line B", "Line C", ""] )

这对我来说似乎是错误的 - 我有一个四行文件,用 getline() 枚举它只剩下 3 行。真正让我摸不着头脑的是,这正是标准所说的应该做的。 (21.3.7.9)

甚至Python也有类似的行为(但它也给了我换行符 - C++把它们砍掉了。)这是一些奇怪的事情吗?C++预计行会终止,而不是用'\n'分隔,我是喂养方式不同?

编辑

显然,我需要在这里扩展一下。我遇到了两种确定文件中“行”是什么的哲学:

  • 由换行符终止 - 在 Linux 等系统和 vim 等编辑器中占主导地位。如果没有最后的 '\n'(vim 中的“noeol”),可能会有一个稍微“奇怪”的文件。文件末尾不可能有空行。
  • 行由换行符分隔 - 在我遇到过的几乎所有 Windows 编辑器中都占主导地位。每个文件都是有效的,最后一行可能为空。

当然,YMMV 什么是换行符。

我一直将它们视为两种完全不同的思想流派。我之前试图提出的一个问题是,C++ 标准是显式地还是仅仅隐式地遵循第一个标准。

因此,回到当前的问题,第二个示例(可以被认为是“A\nB\nC\n”)有行,遵循分离的哲学。现在,C++ 是否明确遵循终止哲学,或者这只是标准的方式? (他们没有在标准中记录太多推理......)我不太愿意说它是明确的,因为判断你是否有 vim 所谓的 C++ 的“noeol”文件有点痛苦。 (例如,Python 会保留换行符,因此您可以这样辨别)

由于 Windows 中的所有内容都遵循分离的理念,因此我正在寻找比“两个示例都有 3 行”更深入的内容。

(奇怪,Mac 在哪里?终止或分离?)

最佳答案

C++ 标准对 getline 有这样的规定:

C++ 2003, 21.3.7.9/5

[getline(is, str, delim)] … extracts characters from is … until any of the following occurs:

  • end-of-file occurs on the input sequence …
  • c == delim [N.b. default delim is '\n'] for the next available input character c (in which case, c is extracted but not appended)
  • str.max_size() characters are stored

添加了 Bracketd 编辑评论

用您的白话来说,getline'\n' 视为终止符,而不是分隔符。

关于c++ - getline() 设置故障位并跳过最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2960596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com