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。