类scanf函数中%[*]type的巧用场景

2011-02-24 wcdj

 

%[*]type,此问题对scanf和fscanf通用。关于*号用法的解释如下。
%[*][width][modifiers]type
* —— An optional starting asterisk indicates that the data is to be retrieved from stdin but ignored, i.e. it is not stored in the corresponding argument.

应用场景1:
将文件中的数据读入到指定的变量中,文件中数据的格式为:(每行第一个数为行号,后三个数为int型,再后三个数为double型)
1 1,2,3,1.2,3.4,5.5
2 22,31,100,1.0,2.2,-3.5
……

 

#include <cstdio> int main() { int a,b,c; double d,e,f; d=e=f=0.0; FILE* pFile = fopen("yourfile","r"); if (pFile == NULL) perror ("Error opening file"); else { while (fscanf(pFile, "%*d %d,%d,%d,%lf,%lf,%lf", &a,&b,&c,&d,&e,&f) != EOF)// 注意%*d后有一个空格,要与文件中数据的格式对应 printf("%d,%d,%d,%lf,%lf,%lf/n", a,b,c,d,e,f); fclose (pFile); } return 0; }

 

结论:使用%*d可以跳过第一列的序号。

应用场景2:
从文件中逐个读出能读的浮点数,比如"1.0,3.5,2.2 ……"
题目来源:
http://topic.csdn.net/u/20110218/12/E039E736-CA2F-4168-B06A-14D386D511C5.html
http://topic.csdn.net/u/20110223/15/3fd75e15-fe7d-432b-8b6c-c048ddec20a0.html?38465

#include <cstdio> int main() { int n=0,r; double d=0.0; FILE *pFile=fopen("yourfile","r"); if (pFile == NULL) perror ("Error opening file"); else { while (1) { r=fscanf(pFile,"%lf",&d); if (1==r)// 读取成功 { ++n; printf("[%d]==%lg/n",n,d);//可以试试注释掉这句以后的速度 } else if (0==r)// 读取失败 { fscanf(pFile,"%*c");// 跳过非法数据 } else// EOF break; } fclose(pFile); } return 0; }

 

测试数据:
1 1,2,3,1.2,3.4,5.5
2 22,31,100,1.0,2.2,-3.5
wcdj 2011 hello123.456world #123&456*789!

输出:
[1]==1
[2]==1
[3]==2
[4]==3
[5]==1.2
[6]==3.4
[7]==5.5
[8]==2
[9]==22
[10]==31
[11]==100
[12]==1
[13]==2.2
[14]==-3.5
[15]==2011
[16]==123.456
[17]==123
[18]==456
[19]==789

 

 

 

 

你可能感兴趣的:(c,File,测试,null)