为什么没有>> ENDL?

时间:2016-10-29 17:06:47

标签: c++ iostream

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

为什么输入流没有endl说明符?相反,似乎我们必须使用丑陋的

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

2 个答案:

答案 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