- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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'分隔,我是喂养方式不同?
显然,我需要在这里扩展一下。我遇到了两种确定文件中“行”是什么的哲学:
当然,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 fromis
… 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 characterc
(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/
main = do input [f a] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) x sequenceA xs 很
while(getline()) 和 while(!getline().eof()) 有什么区别? 正在解析输入字符串。我尝试了两种条件检查,结果有所不同。 std::string testStr =
我知道我知道。以前有人问过这个问题,但我查看了所有答案,但似乎没有一个能解决我的问题。当我使用 getline 函数获取文件中一行的内容时,它不起作用。 getline(file, line); '文
使用 getline() 函数时出现以下错误: 没有重载函数“getline”的实例匹配参数列表 在一个名为“Time”的类中,我在读取以下输入时使用它: istream & operator >>
我正在阅读 C++ 入门书并尝试所有代码示例。我对这个很感兴趣: #include #include using std::string; using std::cin; using std::c
#include #include #include using namespace std; int main() { char d,a[9],e[9]; cin.getline(a,9); c
假设我想从控制台读取一个整数,并且我不希望程序在输入非整数字符时中断。这就是我的做法: #include #include #include using namespace std; int m
这可能不是一个错误,但我不知道出了什么问题。我的第一个条目在第二次迭代中对 str1 重复,并且从那时起也是如此。只有第一次迭代顺利。 #include #include using namesp
string text; getline(text.c_str(),256); 1) 我收到错误消息“错误:没有匹配函数来调用‘getline(const char*, int)”上面有什么问题,因为
哪个更好,更受欢迎?我真的发现阅读 API 令人困惑。 最佳答案 成员(member)版读入char*,免费版读入std::string。所以更喜欢免费版!像这样使用它: std::istream &
我正在尝试解决这个问题,但出于某种原因,我一直收到这个问题: no instance of "getline" matches the argument list. 我查过这个问题,很多次是因为人们使
长话短说 使用 libc++ 版本的 getline 函数的程序在从管道读取输入时会阻塞,直到管道的缓冲区已满。 NOT libstdc++ 版本的 getline 函数也是如此:这里函数立即读取并返
我的程序的一部分: #include #include #include #include #include using namespace std; /* Works for istrin
我是一名正在准备期末考试的 C++ 初学者。我用两种方式写了一个程序。第一个代码使用 cin.getline() 并且不能正常工作。第二个代码使用 cin.get() 和 cin >> 并正确执行所有
我正在尝试使用 getline 解析文档以获取整行并将其放入名为“line”的字符串变量中。问题是我收到一条错误消息:“没有重载函数 getline 的实例与参数列表匹配。”谁能帮我解决这个问题? #
我有一个带有 getline 函数的源代码文件,当我编译它时收到错误(下面的代码和错误)。我的问题是我从一个已经编译和工作的程序(也包括在下面)中复制并粘贴了整个函数。我在程序的其他 2 个源代码文件
我正在尝试从文件中读取,但 C++ 不想运行 getline()。 我收到这个错误: C:\main.cpp:18: error: no matching function for call to '
例子: std::ifstream in("some_file.txt"); std::string line; // must be outside ? while(getline(in,line)
注意:已解决,问题不是 getline() 而是 find 函数数组填充不当! 在发布我自己的问题之前,我已经查找了几个问题,但找不到我的问题的答案。这是我发布的第一个问题,但在发布我自己的问题之前,
我的代码块中有一个 getline 函数。但是在编译 make 文件时出现以下错误: cc -DMAIN -c -o terp.o terp.c terp.c:130:15: error: con
我是一名优秀的程序员,十分优秀!