从文本文件中读取格式化输入时,没有什么比跳过行尾更自然了。
为什么输入流没有endl
说明符?相反,似乎我们必须使用丑陋的
In.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
答案 0 :(得分:3)
...跳过该行的结尾。
......我们必须使用丑陋的
In.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
所引用的节目并不只是&#34;跳过该行的结尾&#34; (字符)。它会跳过整个线路的其余部分。事实上,据我所知,没有更简单的方法可以跳过剩下的部分,但如果你发现这个丑陋,你可以写一个帮助函数,这样你就不需要重复丑陋的代码。 / p>
如果您只是想跳过行尾的字符,那么以下就足够了,而且不那么难看
In.ignore(1, '\n');
为什么输入流没有endl说明符?
endl
写入换行符并刷新输出流。在我看来,跳过线的其余部分似乎不是一个逻辑输入流类似物。
如果您有更好的方法表达跳过结束(或休息?)的线路,那么请随意提出替代方案。虽然我个人会欢迎你的建议,但很难进一步提高标准采纳这一建议的可能性。为此,你应该向委员会提议。
答案 1 :(得分:2)
您可以按如下方式定义自己的输入流操纵器:
std::istream& skip_till_endl(std::istream& in)
{
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
return in;
}
用法示例:
$ cat main.cpp
#include <iostream>
#include <limits>
std::istream& skip_till_endl(std::istream& in)
{
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
return in;
}
int main()
{
int i, j;
std::cin >> i >> skip_till_endl;
std::cin >> j >> skip_till_endl;
std::cout << "\n\n--- Output ---\n";
std::cout << "i=" << i << std::endl;
std::cout << "j=" << j << std::endl;
}
$ make main
g++ main.cpp -o main
$ ./main <<END
1 abc
2 def gh
END
--- Output ---
i=1
j=2