簡體   English   中英

std :: cout的奇怪問題

[英]Strange problem with std::cout

我有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 ++中面臨此問題!

std::endl也刷新緩沖區。 如果要刷新而不換行,請使用std::flush

您怎么知道沒有endl不會打印任何內容? 通過觀察正在運行的程序? 如果是這樣,則問題是cout提供了緩沖的輸出:實際上,只有在其緩沖區已滿時, cout才會在屏幕(或文件)中打印內容。

另一方面, endl沖洗緩沖區。

如果想要無緩沖的輸出,可以使用cerr ,但這會導致一些差異(例如,現在,如果您要將輸出重定向到文件,則應該執行2>而不是>等)。

如果你想緩沖輸出,但不希望有換行符,打印flushcout

我認為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

您沒有顯示完整的程序,但是我懷疑它以system("pause");結尾system("pause"); ,就像在MSVC教程中經常看到的那樣。 調用system()時,MSVC運行時不會刷新輸出緩沖區(不需要這樣做),因此,如果沒有std::flushstd::endl或來自std::cin輸入,則所有輸出到std::cout保持緩沖。 std::cin進行了。

嘗試在控制台窗口(開始->運行-> cmd.exe)中運行程序。 程序終止時,即使沒有endl ,輸出也應該出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM