一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN C/C++领域新星创作者blog.csdn.net/chuxinchang…
- 掘金LV3用户 juejin.cn/user/138142…
- 阿里云社区专家博主,星级博主,技术博主 developer.aliyun.com/profile/exp…
- 华为云云享专家 bbs.huaweicloud.com/community/m…
fread - 以二进制形式读取
返回值
- 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;
}
假设每次从流中读取n个数据到buffer(数组/地址),则判断条件为:fread(buffer,size,n,pf) == n,当不满足该条件说明结束读取了
fscanf - 格式化读取
返回值
- 返回的是成功读取到的个数
- 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:把流的数据读取出来
执行结果