以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件。今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数。哎 以前自己做了这么多无用功,在这里详细解析一下fscanf函数:
fscanf()函数(有点像正则表达式):
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
用 法:int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(文件指针,格式字符串,输入列表);
for example:
FILE*fp;
chara[10];
intb;
doublec;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,数值等于[argument...]的个数
其中的format就是相当于正则表达式中的格式,即用什么样的格式来分隔文件中的信息。光说不好理解,一下用一个例子来说明具体怎么用:
首先我有一个data。txt的文件里面的数据格式如下:
2,50,41,w,20.585828
4,52,51,r,52.012547
.........................
许多条类似的记录,都是以,来分隔的
.......................
我实现的功能就是把上面文件中的数据的五个字段赋值给相应的五个变量,并且输出这些变量的值。实现的程序如下:
#include<stdio.h> #include<stdlib.h> int main() { int fd; long dev; long offset; long length; char ch; double ts=0.000000; if((fd=fopen("/home/haixian/ceshi/data.txt","r"))<0) { printf("open the file is error!\n"); exit(0); } lseek(fd,0,SEEK_SET); while(5==fscanf(fd,"%ld,%ld,%ld,%c,%lf\n",&dev,&offset,&length,&ch,&ts)) {在这里就是第二个参数指定分隔参数的格式,在这里使用的是,来分隔。这样就很容易的获取了记录的各个字段的值并不需要自己编写函数来进行解析什么的。 printf("%ld,%ld,%ld,%c,%lf\n",dev,offset,length,ch,ts); } close(fd); return 0; }
通过上面的例子能很好的理解fscanf函数的用法。以前自己写程序解析这种文件,费力还不讨好,得出的结果还不准确。哎 只能感叹我太弱了,以后还得好好学习!!!!
大家好!我在用fscanf函数从文本文件中读取数据的时候,我想只读取一行中的前面几个数,后面的全部字符都不读取,然后接着读下一行。比如我的数据文件如下 23 456 #number 78 981 #number 我用 fscanf("%d%d\n", &a,&b); fscanf("%d%d\n", &c, &d); 目的是想令a = 23, b = 456, c = 78, d = 981, 而读取的时候,想忽略每一行后面的“#number”字符串。但是我失败了。请问我该怎么样写格式控制?不想多定义一个字符串变量来读取这个字符串。谢谢!!
----------------------------------------------------------------------
引用: fscanf("%d%d%*s", &a,&b); fscanf("%d%d%*s", &c, &d);兄弟,这个方法我早前也试过了的,存在多个以空格隔开的字符串时不管用。
--------------------------------------------------------------------
引用: 你没说有多个字符串呀 fscanf("%d%d%*[^\n]%*c", &a,&b); fscanf("%d%d%*[^\n]%*c", &c, &d);谢谢!经过测试,上述方法是很好的。同时发现,格式串中的%*c可以换成\n。此外,如果要从下一行开始读入的是数值变量,而不是字符变量,那么省略%*c或\n也完全没有问题。但如果下一个要读入的是字符变量,且要求从下一行开始的字符读,那么%*c或\n就不可以省略了。