fscanf()函数详解
fscanf()函数详解
函数名: fscanf
功能: 从⼀个流中执⾏格式化输⼊,fscanf遇到空格和换⾏时结束,注意空格时也结束。这
与fgets有区别,fgets遇到空格不结束。
⽤法: int fscanf(FILE *stream, char *format,[]);
int fscanf(⽂件指针,格式字符串,输⼊列表);
for example:
FILE *fp;
char a[10];
int b;
double c;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,成功读⼊的参数的个数
编辑本段
格式字符说明
编辑本段格式字符说明
常⽤基本参数对照:
%d:读⼊⼀个⼗进制整数.
%i :读⼊⼗进制,⼋进制,⼗六进制整数,与%d类似,但是在编译时通过数据前置来区分进制,如加⼊“0x”则是⼗六进制,加⼊“0”则为⼋进制。例如串“031”使⽤%d时会被算作31,但是使⽤%i时会算作25.
%u:读⼊⼀个⽆符号⼗进制整数.
%f %F %g %G : ⽤来输⼊实数,可以⽤⼩数形式或指数形式输⼊.
%x %X:读⼊⼗六进制整数.
%o': 读⼊⼋进制整数.
%s : 读⼊⼀个字符串,遇空格结束。
%c : 读⼊⼀个字符。⽆法读⼊空值。空格可以被读⼊。
附加格式说明字符表修饰符说明
L/l 长度修饰符输⼊"长"数据
h 长度修饰符输⼊"短"数据
⽰例说明
如果要求从标准输⼊中输⼊⼀串字符串和⼀个整型数,那么参数“%s%d”表⽰什么呢?默认情况下,在终端上(这⾥假设程序为控制台应⽤程序)输⼊第⼀个参数的值的时候敲下回车,则在第⼆⾏输⼊的为第⼆个参数值,采⽤这种输⼊⽅法那么格式字符的形式就⽆关紧要了。
这⾥要特殊说明的是如果参数在同⼀⾏给出,那么格式字符的参数与终端的输⼊会有什么关系。举个例
⼦:如果格式字符为“%s+%d”,那么参数的输⼊就应该为 string + integer。
程序例
编辑本段程序例
编辑本段
例⼀
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i;
printf("Input an integer: ");
/
* read an integer from the
standard input stream */
if (fscanf(stdin, "%d", &i))
printf("The integer read was: %d\n",i);
else
{
fprintf(stderr, "Error reading an \
integer from stdin.\n");
exit(1);
}
return 0;
}
返回EOF如果读取到⽂件结尾。
例⼆
附:MSDN中例⼦
Example
/* FSCANF.C: This program writes formatted
* data to a file. It then uses fscanf to
* read the various data back from the file.
*/
#include <stdio.h>
FILE *stream;
int main( void )
{
long l;
float fp;
char s[81];
char c;
stream = fopen( "fscanf.out", "w+" );
if( stream == NULL )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %ld %f%c", "a-string",
65000, 3.14159, 'x' );
/* Set pointer to beginning of file: */库函数printf详解
fseek( stream, 0L, SEEK_SET );
/* Read data back from file: */
fscanf( stream, "%s", s );
fscanf( stream, "%ld", &l );
fscanf( stream, "%f", &fp );
fscanf( stream, "%c", &c );
/* Output data read: */
printf( "%s\n", s );
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );
fclose( stream );
}
}
以前解析有规律的⽂件的时候要么⽤正则表达式,要么就是傻傻的⾃⼰写程序来解析有规律的⽂件。今天突然发现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<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/","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就不可以省略了。