[英]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個字符串:
65
和A000
。
現在循環1不打印任何內容,實際上循環似乎根本沒有運行。
但是,如您在循環2中看到的那樣添加endl
,將提供以下輸出:
-----IN LOOP----65
-----IN LOOP----$A000
到底是怎么回事?
請注意,我僅在Visual Studio 2010中而不是在Dev-C ++中面臨此問題!
std::endl
也刷新緩沖區。 如果要刷新而不換行,請使用std::flush
。
您怎么知道沒有endl
不會打印任何內容? 通過觀察正在運行的程序? 如果是這樣,則問題是cout
提供了緩沖的輸出:實際上,只有在其緩沖區已滿時, cout
才會在屏幕(或文件)中打印內容。
另一方面, endl
沖洗緩沖區。
如果想要無緩沖的輸出,可以使用cerr
,但這會導致一些差異(例如,現在,如果您要將輸出重定向到文件,則應該執行2>
而不是>
等)。
如果你想緩沖輸出,但不希望有換行符,打印flush
到cout
。
我認為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::flush
, std::endl
或來自std::cin
輸入,則所有輸出到std::cout
保持緩沖。 std::cin
進行了。
嘗試在控制台窗口(開始->運行-> cmd.exe)中運行程序。 程序終止時,即使沒有endl
,輸出也應該出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.