admin 管理员组文章数量: 1184232
2024年3月7日发(作者:fedora14官网下载)
fscanf()函数详解
以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件。今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数。做了这么多无用功,在这里详细解析一下fscanf函数:
fscanf()函数(有点像正则表达式):
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
用 法:int fscanf(FILE *stream, char *format,[]);
int fscanf(文件指针,格式字符串,输入列表);
for example:
FILE*fp;
chara[10];
intb;
doublec;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,数值等于[]的个数
其中的format就是相当于正则表达式中的格式,即用什么样的格式来分隔文件中的信息。光说不好理解,一下用一个例子来说明具体怎么用:
首先我有一个data。txt的文件里面的数据格式如下:
2,50,41,w,20.585828
4,52,51,r,52.012547
哎 以前自己
.........................
许多条类似的记录,都是以,来分隔的
.......................
我实现的功能就是把上面文件中的数据的五个字段赋值给相应的五个变量,并且输出这些变量的值。实现的程序如下:
#include
#include
int main()
{
int fd;
long dev;
long offset;
long length;
char ch;
double ts=0.000000;
if((fd=fopen("/home/haixian/ceshi/","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函数的用法。
下面介绍一个例子, 运行后产后一个的文件。
例11:
#include
main()
{
char *s="That's good news"); /*定义字符串指针并初始化*/
int i=617; /*定义整型变量并初始化*/
FILE *fp; /*定义文件指针*/
fp=fopne("", "w"); /*建立一个文字文件只写*/
fputs("Your score of TOEFLis", fp);/*向所建文件写入一串字符*/
fputc(':', fp); /*向所建文件写冒号:*/
fprintf(fp, "%dn", i); /*向所建文件写一整型数*/
fprintf(fp, "%s", s); /*向所建文件写一字符串*/
fclose(fp); /*关闭文件*/
}
用DOS的TYPE命令显示的内容如下所示:
屏幕显示
Your score of TOEFL is: 617
That's 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产生的文件, 并将读出的结果显示在屏幕上。
例12
#include
main()
{
char *s, m[20];
int i;
FILE *fp;
fp=fopen("", "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
That's 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://","r");
if(fp==NULL)
{
printf("file open error/n");
return -1;
}
char buf[46];
char str[13];
memset(str,0,sizeof(str));
memset(buf,0,sizeof(buf));
while(!feof(fp))
{
fgets(buf,sizeof(buf),fp);
for(i=0;buf[i];i++)
{
if(buf[i]!=',')
{
str[j]=buf[i];
j++;
}
else if(buf[i]==',')
{
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://","r");
if(fp==NULL)
{
printf("file open error/n");
return -1;
}
char str[11];
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;
}
怎么将文件中的多行字符串读入到一个二维数组中?
求助:如何将文件中的多行字符串读入到一个二维数组中????
在这个文件中有这样三行数据:
asdf a
dfe de d
de i am
------解决方案--------------------
fscanf(f1,"%s",a[i])遇到空格就停止了,读取一行要用fgets。
C/C++ code
#include
#include
int main()
{
FILE *f1,*f2;
char a[101][31]={0};
int i,j,x,num=0,sum=0;
f1=fopen("","rt");
f2=fopen("","wt");
for(i=1;i<101;i++)
{
//fscanf(f1,"%s",a[i]);
fgets(a[i], 30, f1);
if(feof(f1)==EOF)
break;
}
for(i=0;i<6;i++)
printf("%c",a[1][i]);
fclose(f1);
fclose(f2);
getch();
}
------解决方案--------------------
读取一行要用fgets,遇到n结束
用fscanf逐个读单词,遇到制表符、空格或者换行符结束
版权声明:本文标题:fscanf类函数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1709777362a546262.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。