为什么>>没有?

Why is there no in >> endl?

本文关键字:gt 没有 为什么      更新时间:2023-10-16

当从文本文件中读取格式化的输入时,没有什么比跳过行尾更自然的了。

为什么输入流没有endl说明符?相反,我们似乎不得不使用难看的

In.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

…跳过行尾

…我们必须使用难看的

In.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

加引号的程序不只是"跳过行尾";(字符)。它会跳过整条线。实际上,据我所知,没有更简单的方法可以跳过这一行的其余部分,但是如果您发现这一行很难看,您可以编写一个辅助函数,这样您就不需要重复这些难看的代码了。

如果您只是想跳过行字符的末尾,那么下面的内容就足够了,而且不那么难看

In.ignore(1, 'n');

为什么输入流没有endl说明符?

endl写换行符并刷新输出流。在我看来,跳过这一行的其余部分似乎不像是逻辑输入流的模拟。

如果你有更好的方式来表达行尾(或休息?)的跳过,那么请随意提出替代方案。虽然我个人欢迎你在这里提出的建议,但这很难增加这种建议被标准通过的机会。为此,你应该向委员会提出建议。

你可以定义自己的输入流操纵符,如下所示:

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 << "nn--- 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