C语言fscanf的用法是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言fscanf的用法是啥相关的知识,希望对你有一定的参考价值。
功 能: 从一个流中执行格式化输入\x0d\x0a 用 法: int fscanf(FILE *stream, char *format,[argument...]);\x0d\x0a int fscanf(文件指针,格式字符串,输入列表);\x0d\x0a 返回值:整型,数值等于[argument...]的个数\x0d\x0a 程序例:\x0d\x0a #include \x0d\x0a #include \x0d\x0a int main(void)\x0d\x0a \x0d\x0a int i;\x0d\x0a printf("Input an integer: ");\x0d\x0a if (fscanf(stdin, "%d", &i))\x0d\x0a printf("The integer read was: %d\n",\x0d\x0a i);\x0d\x0a else\x0d\x0a \x0d\x0a fprintf(stderr, "Error reading an \\x0d\x0a integer from stdin.\n");\x0d\x0a exit(1);\x0d\x0a \x0d\x0a return 0;\x0d\x0a \x0d\x0a 返回EOF如果读取到文件结尾。 参考技术A 功 能: 从一个流中执行格式化输入用 法: int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(文件指针,格式字符串,输入列表);
返回值:整型,数值等于[argument...]的个数
程序例:
#include <stdlib.h>
#include <stdio.h>
int main(void)
int i;
printf("Input an integer: ");
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如果读取到文件结尾。 参考技术B
用 法: int fscanf(FILE *stream, char *format,[argument...])。
1、fscanf()的format参数允许的格式为:“%[*][width][modifiers]type”。[]中的内容根据需要供选,可缺省,%type必须要有,不可省。
2、“format”是C字符串,由“空格”、“非空格”及“转换符”组成。具体格式为%[*][width][modifiers]type,与“format”中“转换符”对应变量地址的列表,两地址间用逗号隔开。
fscanf()对空格的处理示例代码如下:
re = fscanf(pF, "%d%d%d", &oLine.p, &oLine.l, &oLine.x);if( 3 == re)
//Print on stdout
printf("%d\\t%d\\t%d\\n", oLine.p, oLine.l, oLine.x);
参考技术C
功 能: 从一个流中执行格式化输入
用 法: int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(文件指针,格式字符串,输入列表);
返回值:整型,数值等于[argument...]的个数
程序例:
#include <stdlib.h>
#include <stdio.h>
int main(void)
int i;
printf("Input an integer: ");
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;
char* str = "1 asdf";
int n;
char sz[10];
sscanf(str, "%d%s", &n, &sz);
printf("%d %s", n, sz);
fscanf示例如下,加入pf是指向文件内容为1 asdf的文件指针,得到n=1,sz="asdf"
int n;
char sz[10];
sscanf(pf, "%d%s", &n, &sz);
printf("%d %s", n, sz);
C语言fscanf/fprintf函数(格式化读写文件)的用法(%[]和%n说明符)
[]基本用法
scanf() fscanf()函数,均从第一个非空格的可显示字符开始读起!
众所周之,scanf以空白字符为定界符,但如果输入的字符串是以其它字符为定界符的,那怎么办?
[ ] 就是专门处理这个问题的转换说明符。
[ ] 转换说明符可以通过两种方式产生结果字符集
-
如果第一个 [ 字符右边没有抑扬符 ( ^ ) ,那么处于[ ]之间的字符就是结果字符集,不在其中的可输入字符都作为定界符;
-
如果左边 [ 符号紧靠一个抑扬符 ( ^ ),那么意义相反,也就是 ^ 和 ] 之间的字符是定界符,其余可输入字符是结果字符集。
先来个小例子
%[^=]
上面这个例子里面定界符就是“ = ”,也就是只要不到 = 就不会停止。
下面来继续详解:
在使用 [ ] 说明符之前,得先明白两个概念:
一是扫描列表。扫描列表(scanlist)指的是包含在 [ 和 ] 两个字符之间除紧靠左边 [ 字符的抑扬符之外的字符,例如:
scanf("%[abcd]", ptr);
abcd组成扫描列表。
二是扫描字符集(scanset)。扫描字符集指的是结果字符集,例如上面的例子,结果字符集就是abcd。如果输入一个字符串“cbadkjf”,那么ptr得到的字符串是cbad,kjf三个字符都属于定界符,输入到k字符时输入字符串被截断,kjf三个字符被留在stdin里面。
如果带有抑扬符,例如:
scanf("%[^abcd]", ptr);
扫描列表仍然是abcd,但扫描字符集是除abcd外的可输入字符。如果输入字符串“jksferakjjdf”,ptr得到的字符串是“jksfer”。
如果想限制输入字符串的字符数量,可以象s说明符那样,在[]前面使用位域,例如:
scanf("%10[^abcd]", ptr);
这样结果字符串最多只能包含10个字符(除’/0’字符外)。
[]特殊用法
[
符号可以作为扫描列表中的一个成员,但]
字符除紧贴最左边的[
字符或抑扬符两种情况外,其余情况下都不会被看作扫描列表的成员。例如“%[]abcd]
”或者“%[^]abcd]
”,上述两种情况下]
字符属于扫描列表的成员,但如果是“%[ab]cd]
”,中间的]
字符不会被看作扫描列表的成员,而且输入输出的结果会是乱七八糟的。
对于减号-
,只有在紧贴[
字符或抑扬字符以及作为扫描列表最后一个成员时,-
字符才会被视为扫描列表的成员。c标准把其余情况规定为编译器相关的。大多数编译器把这种情况的减号定义为连字符,例如:
scanf("%[a-zA-Z]", ptr);
那么扫描列表由大小写各26个字母组成。少数编译器仍旧把这种情况下的减号视为扫描列表成员。
fscanf(fd,"%*[^/n]/n");//%*是虚读,没有存,只是让指针跳过了这个变量!
%n用法
%n
说明符输出有效字符数量,%n
在scanf和printf中都可使用。与%n
相对应的形参是一个int类型的指针,%n
不影响scanf和printf的返回值。
例如:
scanf("%d %d%n", &i, &j, &k);
如果输入434 6434,则k等于8,而scanf的返回值仍然为2。
又如:
scanf("%c%n", &ch, &k);
输入“sbcdefdg”后,k等于1,而不是8,因为%c
只取一个字符,%n
输出的是有效字符数量。
%n
用在printf函数里,表示输出的字符数量
例如:
printf("i=%d, j=%d/n%n", i, j, &k);
在i=343、j=123的情况下,k=12,同时%n
不影响printf的返回值,其返回值仍然为12,而不是14。
fscanf() 和 fprintf() 函数
fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。
这两个函数的原型为:
int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );
fp 为文件指针,format 为格式控制字符串,… 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参数。
例如:
FILE *fp;
int i, j;
char *str, ch;
fscanf(fp, "%d %s", &i, str);
fprintf(fp,"%d %c", j, ch);
fprintf() 返回成功写入的字符的个数,失败则返回负数。
fscanf() 返回参数列表中被成功赋值的参数个数。
简单示例
用 fscanf 和 fprintf 函数来完成对学生信息的读写。
#include<stdio.h>
#define N 2
struct stu{
char name[10];
int num;
int age;
float score;
} boya[N], boyb[N], *pa, *pb;
int main(){
FILE *fp;
int i;
pa=boya;
pb=boyb;
if( (fp=fopen("D:\\\\demo.txt","wt+")) == NULL ){
puts("Fail to open file!");
exit(0);
}
//从键盘读入数据,保存到boya
printf("Input data:\\n");
for(i=0; i<N; i++,pa++){
scanf("%s %d %d %f", pa->name, &pa->num, &pa->age, &pa->score);
}
pa = boya;
//将boya中的数据写入到文件
for(i=0; i<N; i++,pa++){
fprintf(fp,"%s %d %d %f\\n", pa->name, pa->num, pa->age, pa->score);
}
//重置文件指针
rewind(fp);
//从文件中读取数据,保存到boyb
for(i=0; i<N; i++,pb++){
fscanf(fp, "%s %d %d %f\\n", pb->name, &pb->num, &pb->age, &pb->score);
}
pb=boyb;
//将boyb中的数据输出到显示器
for(i=0; i<N; i++,pb++){
printf("%s %d %d %f\\n", pb->name, pb->num, pb->age, pb->score);
}
fclose(fp);
return 0;
}
运行结果:
Input data:
Tom 2 15 90.5
Hua 1 14 99
Tom 2 15 90.500000
Hua 1 14 99.000000
打开 D:\\demo.txt,发现文件的内容是可以阅读的,格式非常清晰。用 fprintf() 和 fscanf() 函数读写配置文件、日志文件会非常方便,不但程序能够识别,用户也可以看懂,可以手动修改。
如果将 fp 设置为 stdin,那么 fscanf() 函数将会从键盘读取数据,与 scanf 的作用相同;设置为 stdout,那么 fprintf() 函数将会向显示器输出内容,与 printf 的作用相同。
例如:
#include<stdio.h>
int main(){
int a, b, sum;
fprintf(stdout, "Input two numbers: ");
fscanf(stdin, "%d %d", &a, &b);
sum = a + b;
fprintf(stdout, "sum=%d\\n", sum);
return 0;
}
运行结果:
Input two numbers: 10 20
sum=30
以上是关于C语言fscanf的用法是啥的主要内容,如果未能解决你的问题,请参考以下文章
linux 操作系统下能用fprintf() 及fscanf()等函数吗?它们与c语言中的用法一样吗?
c语言中的一个语句fscanf(fp,"%d,",&xx[i]);是啥意思