說明:
VS2010中使用fopen,是沒有問題的。使用VS2015時由於VS的高版本對文件操作的安全性有了較高的要求,所以會出現如下情況:
fopen用法:
fp = fopen(filename,"w")。//返回值: fopen打開文件成功,返回文件指針(賦值給fp),打開失敗則返回NULL值;
fopen_s用法:
errno_t err; err = fopen_s(&fp,filename,"w")//fopen_s打開文件成功返回0,失敗返回非0的錯誤代碼。
探討比較 :
1.fopen_s的安全是在於閉函數fopen多了溢出檢測;
2.在使用上,函數fopen的返回值是文件指針,如果返回的文件指針為NULL時,則表示打開文件失敗。而函數fopen_s的返回值是相應的錯誤代碼,通過查看錯誤代碼代表的含義,有助於排查問題。
3.fopen_s打開的文件不能共享,如果你打開的文件需要共享的話,不能使用fopen_s函數。可以考慮_fopen,_wfsopen這兩個函數。
參數解釋:
文件訪問 模式字符串 |
含義 | 解釋 | 若文件已存在的動作 | 若文件不存在的動作 |
---|---|---|---|---|
"r" |
讀 | 打開文件以讀取 | 從頭讀 | 打開失敗 |
"w" |
寫 | 創建文件以寫入 | 銷毀內容 | 創建新文件 |
"a" |
后附 | 后附到文件 | 寫到結尾 | 創建新文件 |
"r+" |
讀擴展 | 打開文件以讀/寫 | 從頭讀 | 錯誤 |
"w+" |
寫擴展 | 創建文件以讀/寫 | 銷毀內容 | 創建新文件 |
"a+" |
后附擴展 | 打開文件以讀/寫 | 寫到結尾 | 創建新文件 |
例子:
errno_t err; string strFile = "D:\\A.txt"; FILE *fp = NULL; err = fopen_s(&fp, strFile.c_str(), "w"); fprintf(fp, "AA=%s", strB.c_str()); fclose(fp);