1,fsacnf函數介紹
linux
函數原型:int fscanf(FILE *stream, char *format, arguments...);windows
參數介紹:FILE *stream 文件指針,即文件流(文件數據存放的地方,要從裏面講數據拿出來);數組
char *format 格式字符串("%d%2s%"之類的);
緩存
arguments 輸入列表(地址);
函數
函數功能:從stream中按format格式讀取文件到arguments中。
spa
注意: fsacnf遇到換行時結束,遇到空格也結束(這與fgets不一樣);
指針
示例:
code
fscanf(stream,"%02s%20s%15s%8s%5s%2s%6s%12s %06s%06s %6s %6s %12s\n" ,s.trans_type,s.f_card_no,s.merchant_no,s.terminal_id ,s.date_exp,s.resp_code, s.auth_id, s.amount, s.time_header ,s.stime1,s.sys_trace_num, s.invoice_v, s.ref_no);
這是stream文件流中一行數據,orm
021234567890123456111 104110054111334110064381212 00666666000001560000 131230121344 888888 777777 123456789012 0
以上代碼從文件流stream中取出字符串,輸出到後面的各個字段中,其實這裏有一個問題,由於文件中每一行字符串中都有空格,而fsacnf遇到空格會結束,因此並不能準確的把字符串一一對應的輸入到後面的地址中,而且有很大可能會發生越界,若是這樣寫代碼,在編譯時極可能經過,且可以運行,可是結果卻不是咱們想要的。因此接下來就有了fgets。
字符串
2, fgets函數介紹
函數原型:char *fgets(char *buf, int bufsize, FILE *stream);
參數介紹:char *buf 字符型指針,用來存儲取得的數據;
int bufsize 指明buf指針指向字符數組的大小;
FILE *stream 文件指針,將要讀取的文件流;
函數功能:從文件結構體指針stream中讀取數據,每次讀取一行。讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦'\0'),若是文件中的該行,不足bufsize個字符,則讀完該行就結束。函數成功將返回buf,失敗或讀到文件結尾返回NULL。所以咱們不能直接經過fgets的返回值來判斷函數是不是出錯而終止的,應該藉助feof函數或者ferror函數來判斷。(摘自百度百科)
示例:
因爲個人文件每一行的格式是固定的,請儘可能不要這樣寫。
memset(data1, 0, sizeof(data1)); fgets(data1,sizeof(data1),stream); memcpy(s.f_card_no,data1+2,sizeof(s.f_card_no)-1); memcpy(s.merchant_no,data1+22,sizeof(s.merchant_no)-1); memcpy(s.amount,data1+63,sizeof(s.amount)-1); memcpy(s.stime1,data1+79,sizeof(s.stime1)-1);
以上代碼可以準確無誤的把文件中的數據輸入到每一個字符串數組中去,文件格式同fsacnf。
fgets的優勢:
1,跨平臺(windows和linux下換行是有區別的);
2,讀取指定大小的數據,以避免形成緩存溢出;
從文件讀數據,推薦使用fgets。