从文件中读取需要的数据(fscanf和fgetc配合使用)

2011-03-14 wcdj

 

问题:
如何验证一个4位数是否已存在于一个txt文件中。in.txt 里是任意4个4位数,但是他们由逗号隔开 1234, 2345, 3456, 4567 最后一个4位数里没逗号,现在输入一个4位数判断这个4位数是否存在于in.txt 里。

FILE * in;
int c;
int num;
scanf("%d",&c);
while((fscanf(in,"%d",&num))!=EOF)
{
  if (c==num)
  { printf("right");}
  else
  { printf("wrong");}
}

in.txt 里边是1234, 2345, 3456, 4567 最后一个4位数后边没逗号,这个只能认出第一个4位数1234。 不晓得逗号的识别要怎么做,加到%d前边吗? 前边后边都试了都不行啊,或者应该为第一个4位数验证一次? 可是又如何让第二次fscanf从第二个4位数开始呢?

 

思路:

当fscanf遇到非法数据时处理的方法:
[1] 使用fscanf,并用fgetc跳过非法数据
[2] 根据fscanf的返回值使用%*c跳过非法数据

 

方法1:
前三次用fscanf(in,"%d,",&num),最后一次fscanf(in,"%d",&num) 或者第一次用"%d" 后边的用",%d。这种方法可以但是不够灵活。

方法2 :使用fscanf,并用fgetc跳过非法数据
#include #include int main() { FILE *in = NULL; if( ( in = fopen("file.txt","r") ) == NULL ) return -1; int get,find; scanf("%d",&find); while(true) { if( fscanf(in,"%d",&get) != EOF ) { printf("%d ", get); if(get == find) { printf("right/n"); break; } } else break; if( fgetc(in) == EOF ) break; } fclose(in); return 0; } /* file.txt内容: 1234,234, 44,124,542, 442,135 212, 42, 11, 33, 233, 100, 123 输出: 1234 234 44 124 542 442 135 212 42 11 33 233 100 right */

 

方法3 :根据fscanf的返回值使用%*c跳过非法数据
#include #include int main() { FILE *in = NULL; int r = 0; if( ( in = fopen("file.txt","r") ) == NULL ) return -1; int get,find; scanf("%d",&find); while(true) { if((r = fscanf(in, "%d", &get)) == 1)// ok { printf("%d ", get); if(get == find) { printf("right/n"); break; } } else if (r == 0)// skip illegal data { fscanf(in, "%*c");// ok //fgetc(in);// 或者在这里使用fgetc } else// EOF break; } fclose(in); return 0; } /* file.txt内容: 1234,234, 44,124,542, 442,135 212, 42, 11, 33, 233, 100, 123 输出: 1234 234 44 124 542 442 135 212 42 11 33 233 100 right */

 

方法4 :使用strchr
注意:
[1] 这种方法逗号后必须有空白符。
[2] 当fscanf中为%s的时候不存在非法输入,因此会自动循环读入数据。
#include #include #include int main() { FILE * in; int c; int num; char str[128]; char *p; if( ( in = fopen("file.txt","r") ) == NULL ) return -1; scanf("%d",&c); while((fscanf(in, "%s", str)) != EOF)// 先按字符串读入 { if (p = strrchr(str, ',')) *p=0; num = atoi(str); printf("%d ", num); if (c == num) { printf("right "); break; } } return 0; } /* file.txt内容: 1234, 234, 44, 124, 542, 442, 135 212, 42, 11, 33, 233, 100, 123 输出: 1234 234 44 124 542 442 135 212 42 11 33 233 100 right */

 

参考
使用strtok、sscanf和strpbrk分别解析字符串的方法
scanf中%[*]type的巧用场景
讨论
zhao4zhong1的方法
//d.txt为下面一行内容:(去掉前面的// ) //01.2,3.45;5.6789 -0.12345678901234 abc 1234567890.123456789123456789 1e300 0 #include int n,r; double d; FILE *f; void main() { f=fopen("d.txt","r"); n=0; while (1) { r=fscanf(f,"%lf",&d); if (1==r) { n++; printf("[%d]==%.15lg/n",n,d);//可以试试注释掉这句以后的速度 } else if (0==r) { fgetc(f); } else break; } fclose(f); } //实际运行输出:(去掉前面的// ) //[1]==1.2 //[2]==3.45 //[3]==5.6789 //[4]==-0.12345678901234 //[5]==1234567890.12346 //[6]==1e+300 //[7]==0

 

 

 

 

 

 

你可能感兴趣的:(C/C++)