C 學習筆記(二)

2021-04-13 12:23:31 字數 1369 閱讀 6211

在學習最新的c++標準過程中會碰到很多新問題,這些問題有時候很難理解為什麼會發生。更奇怪的是,似乎跟開發工具有關。如下面這個在vs2005下的例子:

word istatus;

ifstream ifs;

if(i***it(szprlfile,0)

!=0)std::locale::

global

(std::locale(

"")); 

//新增的語句1

ifs.open(szprlfile,ios::in|

ios::binary);

//檔名如果有中文此函式會失敗

ifs.imbue(std::locale("c

"));   

//新增的語句2

ifs.read(data,

sizeof

(data));    

intitotalsize

=ifs.gcount();

//該函式讀取的資料為0;解決方法在呼叫open的前後新增上面兩條語句改變

ifs.close();

上面這段**如果將「新增的語句1」和「新增的語句2」注釋,在vs2005下編譯沒有問題,但是執行問題就來了。可以在執行到ifs.read(data,sizeof(data))的時候檢視data的值,為空。同樣,執行到下一句的時候itotalsize為0。只有將那兩句的注釋去掉,才能得到我們想要的結果。

同樣的**我在dev-c++4.9.9.2上執行正常。據說還是同樣的**在vs2003下正常執行。看來是vs2005本身的問題了。一位大俠給出了下面的分析:

vc8 中fstream的陷阱 

vc8的stl部分相對以前版本作了相當大的改進,但其中乙個更改更象乙個bug。它的file stream 類(含ifstream和ofstream)在open時會自動將檔名轉換成unicode,但轉換時會使用stl庫的預設locale(c locale)來做 page code,這在非英語語言作業系統上會導致檔名錯誤,從而無法開啟檔案。解決的辦法是在程式初始化時(或在執行open之前),將stl的預設locale設定成系統的locale, 具體方法是加入語句 std::local::global(std::locale(「」)); 即stl需要執行乙個初始化過程才能在非英語作業系統上正確執行。locale會影響所有stream的格式化操作,比如設定了中文作業系統的本地locale後,數字會被格式化成逗號分割的三位組(形如123,456,78).這對於需要再從這些格式化後的字串恢復成數字的操作來說是不合適的,使用c locale則不會出現這種問題。要在stream open以後再修改locale,stl提供了stream::imbue操作。可以使用stream::imbue(std::locale(「c」))來將stream的locale再修改回c locale。

C 學習筆記二

chapter22 滾動字幕程式 1.ondraw函式中寫畫得內容.使用invalidate 或者 invalidaterect 重新整理 觸發ondraw 得呼叫.2.windows不允許直接 訪問顯示硬體 我們必須通過和視窗 關聯得 裝置環境 跟顯示硬體 通訊 裝置環境由c 得cdc類 物件表示...

C 學習筆記(二)

本期話題 字串文字常量,指標,引用 1 關於字串文字常量 sizeof bohr 5 字串文字常量的型別是 適當個數的const字元的陣列 所以 bohr 的型別就是const char 5 下面的賦值是可以的 char p bohr 因為在c c 原來的定義裡,字串文字常量的型別就是char 字串...

C 學習筆記(二)

if expression exprsssion必須為bool值 checked和unchecked操作符用於整數算術運算時控制當前環境中的溢位檢查。下列運算參與了check和unchecked檢查 switch case語言 不容許遍歷 foreach 語句 預編譯指令 異常處理 類的宣告 類的宣...