# std::endl ?? *本篇談論的是c++輸出流endl操縱符 其他語言可路過* [endl說明](https://en.cppreference.com/w/cpp/io/manip/endl) ### std::endl vs \n 剛學c++的輸出入時通常會```std::endl```來換行 不過許多大佬卻建議用```'\n'```或```"\n"```替代 為甚麼?差別在哪? [{好文|長文}參見(stackoverflow)](https://stackoverflow.com/questions/213907/stdendl-vs-n) ### 不及時嗎? > With ```\n``` instead of ```endl```, > the output would be the same, > but may not appear in real time. > > 以 ```\n``` 替代 ```endl``` , > 輸出會相同,但可能不會實時出現。 可能 但其實一般都會 原因在於```endl```等同輸出```\n```後執行```std::flush``` 在一般狀況下,換行時會自動刷出緩存 如果使用下一段提到的指令,則```\n```將不會主動刷除緩存 然而```endl```則會保持強制刷出 ```cpp std::cout << std::endl; //is equivalent to std::cout << '\n' << std::flush; ``` 不過使用文本或OJ 輸出不需要及時只需要順序正確時 減少緩存區刷新的次數能確實提升輸出效能 ### C的IO比較快? 預設中c++ 的iostreams 會與 C-streams 同步 這使得在競程中IO速度造成些微影響 某些OJ的老題目中可以讓你的正確的答案TLE 直接的做法就是取消兩個資料流的同步 ```cpp sync_with_stdio(false); ``` ### 緩衝?煩欸 除了標準輸出流```cout```應該有些人知道還有標準錯誤流 其中又有無緩衝的指令```cerr``` 但 **請只把錯誤訊息輸出到錯誤流** ```cerr```會無緩衝的自動沖入 原因是默認使用```unitbuf``` 這代表說我們也可以讓```cout```或其他ostream自動沖入 ```cpp std::cout << std::unitbuf; ``` 跟上面一樣,只要不要C/C++ 混用 緩衝有無只會影響輸出的出現實時與否 輸出仍然相同 ### 還是沖入了 嘗試運行以下指令並隨意輸入10個字串 ```cpp #include <iostream> #include <string> int main(){ ios_base::sync_with_stdio(false); string str; int i = 10; while (i--) { std::cin >> str; std::cout << str << '\n'; } } ``` 觀察輸出就會發現 輸出緩衝仍然在要求輸入時沖出 ### 重點整理 + c++ IO 加速指令 ```cpp ios_base::sync_with_stdio(false); cin.tie(0); ``` + <font color="#f00">關閉後c++ IO與C IO不能混用</font>,cin不能與scanf,sscanf, getchar, fgets等混用,cout不能與printf,puts等混用,否則IO會混亂 + 何時沖入緩衝只會影響輸出出現的時間,輸出仍會相同 + 使用輸出對程式進行偵錯時,應保證緩衝區清空 ###### tags: `基本輸入輸出` `IO`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.