std :: cout的奇怪问题

时间:2011-03-24 14:21:06

标签: c++ iostream

我有2个循环:

//Loop 1
for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
    {
        cout << "-----IN LOOP----" <<  *iter;
    }

//Loop 2
for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
    {
        cout << "-----IN LOOP----" <<  *iter << endl ;
    }

现在vecv是一个字符串向量,包含2个字符串:

分别为

65A000

现在循环1不打印任何内容,实际上循环似乎根本不运行。

但是,如您在循环2中看到的那样添加endl时,它会提供此输出:

-----IN LOOP----65
-----IN LOOP----$A000

到底发生了什么?

请注意,我仅在Visual Studio 2010中遇到此问题,而不是Dev-C ++ !!

4 个答案:

答案 0 :(得分:3)

std::endl也会刷新缓冲区。如果您想在没有换行符的情况下进行刷新,请使用std::flush

答案 1 :(得分:2)

如果没有endl,你怎么知道它不打印任何东西?通过观察运行程序?如果是这样,问题是cout提供缓冲输出:它实际上只在其缓冲区已满时在屏幕上(或在文件中)打印一些内容。

另一只手上的

endl会刷新缓冲区。

如果您想要无缓冲输出,可以使用cerr,但这会导致一些差异(例如,现在如果您想将输出重定向到文件,则应该2>而不是>等等。)

如果您想要缓冲输出但又不想换行,请将flush打印到cout

答案 2 :(得分:0)

我认为cout.clear()只会破坏cout缓冲区。因为它没有被刷新所以它丢失了。

编辑1:代码提供:

#include <iostream>
#include <vector>

using namespace std;

int main(void) {

  vector<string> vecv;

  vecv.push_back("abc");
  vecv.push_back("def");

  //Loop 1
  for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
  {
    cout << "-----IN LOOP 1----" <<  *iter;
  }

  //Loop 2
  for ( vector<string>::iterator iter = vecv.begin() ; iter != vecv.end()  ; iter++)
  {
    cout << "-----IN LOOP 2----" <<  *iter << endl ;
  }
}

输出:

./a.out
-----IN LOOP 1----abc-----IN LOOP 1----def-----IN LOOP 2----abc
-----IN LOOP 2----def

答案 3 :(得分:0)

您没有显示完整的程序,但我怀疑它以a结尾 system("pause");,正如MSVC教程中经常看到的那样。调用system()时MSVC运行时不刷新输出缓冲区(不需要),因此如果没有std::coutstd::flush,则所有输出到std::endl都会保持缓冲状态。已完成std::cin的输入。

尝试在控制台窗口中运行程序(开始 - >运行 - > cmd.exe)。即使没有endl,也应在程序终止时显示输出。