簡單日志輸出:
#include<stdio.h> #include<string.h> #include<stdlib.h> void write(char* filename,char* szStr){ FILE* fp; fp = fopen(filename,"at+"); if(fp != NULL){ fwrite(szStr,256,1,fp); // fclose(fp); fp = NULL; } } int main(int argc, char** argv){ int i; for(i = 0; i < argc; i++){ write("log.txt",argv[i]); } return 0; }
Attention:
fwrite(szStr,256,1,fp); // fwrite(szStr,strlen(szStr),1,fp);
日志會出現亂碼的情況
fopen()函數:
函數聲明:include<stdio.h>
函數原型:FILE *fopen(const char *filename, const char *mode);
函數參數:filename:log文件名 mode:文件訪問模式
函數功能:按照給的的模式mode打開filename所指向的文件
函數返回值:文件順利打開后,指向改流的文件指針就會被返回。如果文件打開失敗,就返回NULL,並把錯誤代碼存儲在error中。
參數說明:
mode有幾種形態的字符串:
r |
以只讀的方式打開文件,文件必須存在 |
r+ |
以讀/寫的方式打開文件,文件必須存在 |
rb+ |
以讀/寫的方式打開一個二進制文件,只允許讀寫數據 |
rt+ |
以讀/寫方式打開一個文本文件,允許讀和寫 |
w |
打開只讀文件,若文件存在則文件長度清零,即文件內容會消失;若文件不存在,則創建該文件 |
a |
以附加的方式打開只寫文件,若文件不存在,則創建該文件,若文件存在,將寫入的數據加在文件的末尾 |
a+ |
以附加的方式打開讀/寫文件,若文件不存在,則創建該文件,若文件存在,將寫入的數據加在文件的末尾 |
wb |
以只寫的方式打開或新建一個二進制文件,只允許寫數據 |
wb+ |
以只寫的方式打開或新建一個二進制文件,允許讀和寫 |
wt+ |
以讀/寫的方式打開一個文本文件,允許讀和寫 |
at+ |
以讀/寫方式打開一個文本文件,允許讀或在文本末追加數據 |
ab+ |
以讀/寫的方式打開一個二進制文件,允許讀或者在文件末尾追加數據 |
補充:
1.以x結尾的模式為獨占模式,文件已存在或無法創建(一般為路徑文件問題)導致fopen打開失敗。文件以操作系統支持的獨占模式打開。
2.上述的形態字符串都可以再加一個b字符,如rb/w+b/ab+等,加入b字符來告訴函數庫以二進制打開文件。如果沒有b,則默認加t,即以文本模式打開文件。
3.二進制和文本模式區別:
在windows系統中,文本模式下:文件以“\n\r”代表換行。若以文本模式打開文件,並用fputs等函數寫入換行符“\n”時,函數會自動在“\n”前面加“\r”。即實際寫入文件的時“\r\n”。
在unix/linux系統中,文本模式下“\n”代表換行,linux系統下文本和二進制模式下無區別。
總結:
- 是否是二進制打開,加b
- 讀寫方式:只讀、只寫、讀寫、追加只寫、追加讀寫。
- 讀文件是否必須存在,以及存在時是清空還是追加不同的響應。
fwrite()函數:
函數原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
函數參數:
ptr: 指向要被寫入的元素數組的指針。
size: 要被寫入的每個元素的大小,單位字節
nmemb: 元素的個數,每個元素大小為size字節
stream: 這是指向FILE對象的指針,該FILE對象指定了一個輸出流。
函數功能:把ptr所指向的數組中的數據寫入到指定的stream中。
返回值: 如果成功,返回一個size_t的對象,表示元素的總數,該對象是一個整型數據類型。如果該數字與nmemb參數不同,則會出現一個錯誤。