fread和fscanf返回值

357 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:


fread - 以二进制形式读取

image-20220310225018479

返回值

image-20220310225033656


  • count:每一次读取的个数
  • 从流中读取count个大小为size的,放在buffer

如果返回值小于count,(不可能大于count),说明已经读取结束了所以可以通过返回值与count的关系判断是否读取结束


例如

count为4,返回值为3。 要读的个数为4个,返回3个,这一次都没有读满,说明已经读完了。这次是最后一次读取


int main()
{
    //存文件
    FILE* pf = fopen("data.txt","wb");//以二进制写入形式打开文件
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    int arr[4] = {3,4,5,6};
    fwrite(arr,sizeof(arr[0]),4,pf);//把arr的数据以二进制形式写入到pf中
    fclose(pf);
    //后面要读取写入的数据,所以先不置空
    
    //读取文件
	pf = fopen("data.txt","rb");//以二进制读取形式打开文件
    size_t tmp = 0; //fread的返回类型为size_t,反正报错
    int a = 0;
    //每次从流中读取1个数据到a,若返回值为1,说明成功读取,若小于1,则说明读取结束
    while( ( tmp = fread(&a,sizeof(int),1,pf) == 1 ) )
    {
        printf("%d ",a);
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

image-20220310225042351


假设每次从流中读取n个数据到buffer(数组/地址),则判断条件为:fread(buffer,size,n,pf) == n,当不满足该条件说明结束读取了


fscanf - 格式化读取

image-20220310225050426

返回值

image-20220310225141229

  • 返回的是成功读取到的个数
  • fscanf正常情况下返回从文件中读出的参数个数

例子

struct S
{
	char name[20];
	int age;
};
int main()
{
	struct S s[3] = { {"Mango",19},{"Lemon",20},{"Orange",21} };

	//打开文件
	FILE* pf = fopen("data.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//格式化写入
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		fprintf(pf, "%s %d", s[i].name, s[i].age);//把结构体三个数据写到文件中
	}
	fclose(pf);
	
	// 打开文件
	pf = fopen("data.txt", "r");
	//格式化读取
	struct S tmp = { 0 };
    
    //fscanf只读取两个参数,成功读取返回2
	while (fscanf(pf, "%s %d", tmp.name, &tmp.age) == 2)
	{
		printf("%s %d\n", tmp.name, tmp.age);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//fprintf:把数据写入到流中
//fscanf:把流的数据读取出来

执行结果

image-20220310225151653