C语言中关于fscanf()方法与fgets()方法的简单知识点总结

 fscanf()

int fscanf(FILE* stream, const char* format, [argument...]);

fscanf()方法与scanf()方法类似。不同的是多了第一个参数,文件指针参数,后两个参数用法类似。其中要注意的是第三个参数处填写变量时,不要遗漏取地址符&

要点

        1. format str:如%d, %f, %c, %s等,分别表示读入一个整数,浮点数,字符,字符串。还可以加上控制,如%ld,表示读入一个长整型数,%20s表示最多读入20个字符
        2. 返回值:在没有出错的情况下,fscanf 返回正确匹配和赋值的域的个数;如果出错,则返回EOF。

        3. 在空白符这个意义上来讲,fscanf 对空格、制表符、换行符是一视同仁的,不加区分的;%s会跳过前面的空白符,但是不会跳过后面的空白符;%c不会跳过空白符
        4. *表示读取一个域,但是不赋值给变量。
        5. []表示只读取中括号内的字符,[]表示不读取中括号内的字符,值得注意的是%[]s将不会跳过前面的空白符。
        6. 如果还没有任何一个域匹配成功或者任何一个匹配失败发生之前,就达到了文件流末尾,就算出错;或者读取文件流出错。这两种情况下,fscanf 返回EOF。

如对以上文件中的数字求和,使用fscanf()方法的时候在判断空格与换行或者制表符的时候表现就是一一的。

处理结果如下

#include<stdio.h>
int main(){
	FILE* fp = NULL; 
	fp = fopen("测试文件01.txt","r");
	int sum =0;int temp =0;
	while(fscanf(fp,"%d",&temp)!=EOF){
		printf("当前数字为: %d\n",temp); 
		sum += temp;
	}
	printf("这是文件中数字总和: %d",sum);
	fclose(fp);
	return 0;
} 

此处应该注意while循环条件不能只填写 fscanf(fp,"%d",&temp) 否则会进入死循环!最标准的就是fscanf(fp,"%d",&temp)!=EOF   切记是!=EOF

fgets()

char *  fgets(char * s, int n,FILE *stream);

因为fgets()方法是获取一行,所以第一个参数就是字符数组,所读出字符串暂存地址。本质上是指针。第二个参数表示每次读入最多n-1个字符,若一行中字符数大于n,则会分多次输出,但是依然要等到一行全部输出完以后才会进行下一行的读取。第三个参数是文件指针。

要点 

        fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据

读取此文件时,第二参数为5时结果如下:

若将参数改为6则结果如下:

#include<stdio.h>
int main(){
	FILE* fp = NULL; 
	fp = fopen("测试文件02.txt","r");
	int sum =0;int temp =0;
	char sd[100];
	while(fgets(sd,6,fp)!=NULL){
		printf("当前数字: %s\n",sd);
	} 
	return 0;
} 

1.        fgets遇到“空格”就跟遇到平常的字符一样读取,遇到“回车”则结束本次读取,最后往缓冲区(char *buf[])的最后加多一个"\0"表示本次读取一行结束。

2.        fscanf不论遇到“空格”还是“回车”,都当作'\0'读取到缓冲区中(char *buf[]),并结束本次读取。

3.        注意在获取文件中所有内容时,while循环中的条件区别!

         fgets()无法使用!=EOF,可以使用 fgets(sd,6,fp)!=NULL 或者fgets(sd,6,fp)

         fscanf()则不可使用以上两种方法,而可以使用!=EOF。

(如有错误的地方,欢迎大家指正!)

猜你喜欢

转载自blog.csdn.net/weixin_49418695/article/details/123384870