亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在同一程序中混合cout和wcout

在同一程序中混合cout和wcout

C++
翻閱古今 2019-12-04 10:47:08
我正在閱讀“ C ++食譜”,其中包含以下代碼段:// cout  << s  << std::endl;  // You shouldn't be able towcout << ws << std::endl;     // run these at the same time如果您有興趣查看實際示例,請訪問以下指向Google圖書頁面的鏈接。另外,我發現了這個SO問題,似乎表明將wcout和cout混合是可以的。有人可以向我解釋此評論在說什么嗎?編輯從C ++標準[27.4.1]:相應的寬字符流和窄字符流的混合操作遵循與在FILEs上混合此類操作相同的語義,如ISO C標準的修訂1所指定。根據C標準[7.19.2]:每個流都有一個方向。在將流與外部文件關聯之后,但是在對該文件執行任何操作之前,該流沒有方向。一旦將寬字符輸入/輸出功能應用于沒有方向的流,該流將成為面向寬方向的流。類似地,一旦將字節輸入/輸出功能應用于沒有方向的流,該流將成為面向字節的流。否則,只有對freopen函數或fwide函數的調用才能更改流的方向。(成功調用freopen會刪除所有方向。)字節輸入/輸出功能不得應用于寬方向的流,而寬字符輸入/輸出功能不應適用于面向字節的流。因此,該標準似乎表明您不應該將它們混合使用。但是,我從這篇文章中找到了這句話:對于Visual C ++ 10.0,fwide函數記錄為未實現。從實際的角度來看,至少在輸出整行的水平上,顯然可以將cout和wcout混合使用。因此,令人高興的是,Visual C ++顯然只是無視該標準的要求,而沒有維護不切實際的顯式C FILE流定向。而且,關于gcc,我從這里找到了這句話:這是一項(新)功能,而不是錯誤,請參閱libstdc ++ / 11705,以及有關C標準(C99,7.19.2)中流方向的一般信息。簡而言之,您不能將面向字節的I / O和面向寬方向的I / O混合使用?,F在,由于 libstdc ++ / 11705中指出的錯誤,您可以通過調用std :: ios :: sync_with_stdio(false);獲得接近預期的效果。在程序開始時。
查看完整描述

3 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

coutwcout稱為首次,為定向stdout成為集。在的情況下cout,stdout變為面向字節的流,在的情況下wcoutstdout變為面向寬字節的流。根據C ++標準[27.4.1]和C標準[7.19.2],一旦設置了流的方向,就不應調用與該流的方向不兼容的函數。


查看完整回答
反對 回復 2019-12-04
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

從技術上講,您絕對可以同時使用窄流和寬流。但是,除非您安排它們兩個對字符進行相同的編碼,否則結果很可能會混亂。不幸的是,這附帶了一個警告,即您不能控制標準流對象使用的編碼,至少不能移植。即使編碼是相同的,也需要確保部分字符被完全寫入,即,當切換到其他寬度時,至少需要刷新緩沖區。


查看完整回答
反對 回復 2019-12-04
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

顯然,每個對象都在“目標”流上添加了方向STDOUT,并且不允許在已添加方向[C++11: 27.4.1]和的流上混合操作[C99: 7.19.2]


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 956 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號