C/C++ 中fopen_s與fopen


在定義FILE * fp 之後,fopen的用法是: fp = fopen(filename,"w")。而對於fopen_s來說,還得定義另外一個變量errno_t err,然後err = fopen_s(&fp,filename,"w")。返回值的話,對於fopen來說,打開文件成功的話返回文件指針(賦值給fp),打開失敗則返回NULL值;對於fopen_s來說,打開文件成功返回0,失敗返回非0。

fopen函數

 fopen("文件名","打開方式")、FILE *fopen( const char *filename, const char *mode );
       r 打開只讀文件,該文件必須存在。r+ 打開可讀寫的文件,該文件必須存在。rb+ 讀寫打開一個二進制文件,只允許讀寫數據。rt+ 讀寫打開一個文本文件,允許讀和寫。  
    w 打開只寫文件,若文件存在則文件長度清爲0,即該文件內容會消失。若文件不存在則建立該文件。w+ 打開可讀寫文件,若文件存在則文件長度清爲零,即該文件內容會消失。若文件不存在則建立該文件。  
    a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)   a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。(原來的EOF符不保留)   wb 只寫打開或新建一個二進制文件;只允許寫數據。   wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。   wt+ 讀寫打開或着建立一個文本文件;允許讀寫。   at+ 讀寫打開一個文本文件,允許讀或在文本末追加數據。   ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
fopen_s函數:fopen_s比fopen多了溢出檢測,更安全一些。
fopen_s(地址指針,"文件地址","打開方式")
例如fopen_s(&id,"test.txt","r");讀取test並讓id指針指向這個文件。
打開方式同fopen。
———————————————————————————————————
問題:vs2005中編程時,遇到如下: warning C4996: “fopen”被聲明爲否決的
解釋:微軟的警告,主要是那些都是C庫的函數,很多函數內部是不進行參數檢測的(包括越界類的),微軟擔心使用這些會造成內存異常,所以就改寫了一下同樣功能的函數,只不過進行了參數的檢測,使用這些新的就可以了。不用特意記,每個函數在給出警告時都會告訴你相應的安全函數,注意一下警告信息就可以了,使用時再 查看一下MSDN。庫函數改寫例子:
    mkdir改寫爲 _mkdir
     fopen”改寫爲 fopen_s
     stricmp改寫爲 stricmp_s
    解決:
1> 根據下面的warning提示:參見“fopen”的聲明消息:“This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
        所以可以將函數按warning提示的第二句使用fopen_s函數即可:
        eg:FILE *pFile=fopen("1.txt", "w");
           改爲:
           FILE* pFile;
           fopen_s(&pFile, "1.txt", "w");
 2> 還是根據warning提示的地三句話:use _CRT_SECURE_NO_DEPRECATE項目|屬性|配置屬性|C/C++|命令行|附加選項,加入【/D "_CRT_SECURE_NO_DEPRECATE" 】(注:加入中括號中完整的內容)
3> 降低警告級別:項目|屬性|配置屬性|C/C++|常規,自己根據情況降低警告級別(此法不推薦)
   注:高度重視警告:使用編譯器的最高警告級別。應該要求構建是乾淨利落的(沒有警告)。理解所有警告。通過 修改代碼而不是降低警告級別來排除警告。
    編譯器是你的朋友。如果它對某個構造發出警告,這經常是說明你的代碼中存在潛在的問題。成功的構建應該是無聲無息的(沒有警告的)。



文章地址 http://blog.163.com/yuyang_tech/blog/static/2160500832013111334135881/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章