【问题标题】:Strange problem with std::coutstd::cout 的奇怪问题
【发布时间】:2011-03-24 14:21:05
【问题描述】:

我有 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++ 中遇到这个问题!!

【问题讨论】:

  • "实际上循环似乎根本没有运行" > 你有没有试过把 IN LOOP 1 和 IN LOOP 2 来区分并确保它没有运行?
  • 这个问题与 c++0x 有什么关系?请删除标签

标签: c++ iostream


【解决方案1】:

std::endl 也会刷新缓冲区。如果你想在不换行的情况下刷新,请使用std::flush

【讨论】:

  • 没关系...它会刷新缓冲区 - 但为什么不打印任何内容?
  • @user:因为只有在刷新缓冲区后文本才会显示在控制台上。
  • 那为什么我在 Dev-C++ 中没有遇到同样的问题
  • 我不知道,没用过。但这些信息应该是您的问题的一部分。
  • @user667389 关于缓冲的确切策略取决于实现,并且实现可能会做不同的事情(从具有不同大小的缓冲区开始)。
【解决方案2】:

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

endl 在另一方面刷新缓冲区。

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

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

【讨论】:

    【解决方案3】:

    您没有显示完整的程序,但我怀疑它以 system("pause");,就像在 MSVC 教程中经常看到的那样。 MSVC 运行时在调用system() 时不会刷新输出缓冲区(它不是必需的),因此如果没有执行std::flushstd::endl 或来自std::cin 的输入,则所有到std::cout 的输出都会保持缓冲。

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

    【讨论】:

      【解决方案4】:

      我认为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
      

      【讨论】:

      • 删除它。还是同样的问题。
      • 提供用于测试目的的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2021-05-08
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多