# 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`