fscanf类函数.docx_第1页
fscanf类函数.docx_第2页
fscanf类函数.docx_第3页
fscanf类函数.docx_第4页
fscanf类函数.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

fscanf()函数详解以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件。今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数。哎 以前自己做了这么多无用功,在这里详细解析一下fscanf函数:fscanf()函数(有点像正则表达式):功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。用 法:int fscanf(FILE *stream, char *format,argument.);int fscanf(文件指针,格式字符串,输入列表);for example:FILE*fp;chara10;intb;doublec;fscanf(fp,%s%d%lf,a,&b,&c)返回值:整型,数值等于argument.的个数其中的format就是相当于正则表达式中的格式,即用什么样的格式来分隔文件中的信息。光说不好理解,一下用一个例子来说明具体怎么用:首先我有一个data。txt的文件里面的数据格式如下:2,50,41,w,20.5858284,52,51,r,52.012547.许多条类似的记录,都是以,来分隔的.我实现的功能就是把上面文件中的数据的五个字段赋值给相应的五个变量,并且输出这些变量的值。实现的程序如下:#include#includeint 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,%lfn,&dev,&offset,&length,&ch,&ts) 在这里就是第二个参数指定分隔参数的格式,在这里使用的是,来分隔。这样就很容易的获取了记录的各个字段的值并不需要自己编写函数来进行解析什么的。 printf(%ld,%ld,%ld,%c,%lfn,dev,offset,length,ch,ts); close(fd);return 0;通过上面的例子能很好的理解fscanf函数的用法。下面介绍一个例子, 运行后产后一个test.dat的文件。 例11: #include main() char *s=Thats good news); /*定义字符串指针并初始化*/ int i=617; /*定义整型变量并初始化*/ FILE *fp; /*定义文件指针*/ fp=fopne(test.dat, w); /*建立一个文字文件只写*/ fputs(Your score of TOEFLis, fp);/*向所建文件写入一串字符*/ fputc(:, fp); /*向所建文件写冒号:*/ fprintf(fp, %dn, i); /*向所建文件写一整型数*/ fprintf(fp, %s, s); /*向所建文件写一字符串*/ fclose(fp); /*关闭文件*/ 用DOS的TYPE命令显示TEST.DAT的内容如下所示: 屏幕显示 Your score of TOEFL is: 617 Thats good news 2. 文件的顺序读操作函数 fscanf()、fgets()和fgetc()函数 函数fscanf()、fgets()和fgetc()均为文件的顺序读操作函数, 其调用格式如下: int fscanf(FILE *stream, char *format, ); char fgets(char *string, int n, FILE *steam); int fgetc(FILE *steam); fscanf()函数的用法与scanf()函数相似, 只是它是从文件中读到信息,如果是连续的字符串的话,或者说每个用逗号隔开的字符串的话,而且又因为fscanf()函数在读取文件的时候遇到内容中为空格的地方要停止,所以这个就得写下形如fscanf(fp,”%s %s %s %s %s %s”,str0,str1,str2,str3,str4,str5)之类的,关键的地方就在于要记住这个每个%s的中间要加空格才行。fscanf()函数的返回值为EOF(即-1), 表明读错误, 否则读数据成功。fgets()函数从文件中读取至多n-1个字符(n用来指定字符数), strlen(string)+1,并把它们放入string指向的字符串中, 在读入之后自动向字符串未尾加一个空字符, 读成功返回string指针,失败返回一个空指针。fgetc()函数返回文件当前位置的一个字符, 读错误时返回EOF。 下面程序读取例11产生的test.dat文件, 并将读出的结果显示在屏幕上。 例12 #include main() char *s, m20; int i; FILE *fp; fp=fopen(test.dat, r); /*打开文字文件只读*/ fgets(s, 24, fp); /*从文件中读取23个字符*/ printf(%s, s); /*输出所读的字符串*/ fscanf(fp, %d, &i); /*读取整型数*/ printf(%d, i); /*输出所读整型数*/ putchar(fgetc(fp); /*读取一个字符同时输出*/ fgets(m, 17, fp); /*读取16个字符*/ puts(m); /*输出所读字符串*/ fclose(fp); /*关闭文件*/ getch(); /*等待任一键*/ 运行后屏幕显示: Your score of TOEFL is: 617 Thats good news 如果将上例中fscanf(fp, %d, &i)改为fscanf(fp, %s, m), 再将其后的输出语句改为printf(%s, m), 则可得出同样的结果。由此可见Turbo C2. 0中只要是读文字文件, 则不论是字符还是数字都将按其ASCII值处理。 另外还要说明的一点就是fscanf()函数读到空白符时, 便自动结束, 在使用时要特别注意C语言从文件中读取多行用逗号分隔数据的解决方案123456659,24666666,45461221,46465333,123456659,24666666,45461221,46465333,123456659,24666666,45461221,46465333,例如数据如上,由于是用逗号分隔,所以要解决去掉逗号的问题。第一种方法:用fgets函数从文件中读取数据,fgets读取数据时以回车或者EOF结束,读取一行后保存在数组中,然后判断是否为逗号,采取相应处理。#include #include int main()int i,j=0,k;FILE *fp=fopen(d:/hh.txt,r);if(fp=NULL)printf(file open error/n);return -1;char buf46;char str13;memset(str,0,sizeof(str);memset(buf,0,sizeof(buf);while(!feof(fp)fgets(buf,sizeof(buf),fp);for(i=0;bufi;i+)if(bufi!=,)strj=bufi;j+;else if(bufi=,)printf(%s/n,str); memset(str,0,sizeof(str);j=0;memset(buf,0,sizeof(buf);fclose(fp);return 0;第二种方法:利用fscanf的格式可以用正则表达式来实现,思路简单#include int main() FILE *fp=fopen(d:/hh.txt,r); if(fp=NULL) printf(file open error/n); return -1; char str11; char ch; int i=0,count=0; fscanf(fp,%,%*c,str); printf(%10s/n,str); while(!feof(fp) fscanf(fp,%,%*c,str); printf(%10s/n,str); fclose(fp); system(pause); return 0;怎么将文件中的多行字符串读入到一个二维数组中?求助:如何将文件中的多行字符串读入到一个二维数组中?在1.txt这个文件中有这样三行数据:asdf adfe de dde i am-解决方案-fscanf(f1,%s,ai)遇到空格就停止了,读取一行要用fgets。C/C+ code#include #include int main()FILE *f1,*f2; char a10131=0; int i,j,x,num=0,sum=0; f1=fopen(1.txt,rt); f2=fopen(2.t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论