文件操作之fread函数和fwrite函数
数据块写函数-fwrite
- 格式:使用手册man一下
size_t
fwrite(const void *restrict ptr, size_t size, size_t nitems,
FILE *restrict stream);
- 含义:从文件指针ptr所指向的内存中读入数据,写入文件stream所指的文件中,写入nitems次数的数据块,每块大小为size字节。
数据块写函数-fread
- 格式:使用手册man的结果
size_t
fread(void *restrict ptr, size_t size, size_t nitems,
FILE *restrict stream);
- 含义:从文件指针stream所指的文件中读入nitems次数据块,每块的大小为size字节,并保存到文件指针所指向的内存中
注意:fread函数和fwrite函数的返回值是size_t, 返回的是执行写操作的次数,我们在fread函数中可以设置每次读的size,nitems读的次数。因此,可以利用这个特性,在代码中判断一下是否读的正确。
另外,因为我们在函数的使用中,一旦发现文件打不开,或者找不到,又或者数据未写入、未读入等问题,需要用exit(1)来结束程序,所以头文件中必须包含
#include
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAMELEN 20
#define STUNUM 5
//1.需要构造表示学生信息的类型struct
typedef struct student
{
char name[NAMELEN];
int age;
int stuID;
}STU;
//2.需要构造一个表示学生名字的数组
char students[STUNUM][NAMELEN] =
{
"zhangsan",
"lisi",
"wangwu",
"zhaoliu",
"xiaoqi"
};
int main (int argc, const char *argv[])
{
//声明一个表示文件的指针
FILE *fp = NULL;
//打开文件,以写的操作模式
fp = fopen ("/Users/qingyun/Desktop/stu.txt","w");
//判断文件是否打开成功,如果打开失败,则需要退出程序
if (NULL == fp)
{
puts("open file:stu.txt error");
exit(1);
}
STU stus[STUNUM] = {0};
//如果打开成功,构造学生信息
for (int i = 0; i < STUNUM;i++)
{
strncpy(stus[i].name,students[i],NAMELEN);
stus[i].age = 20+i;
stus[i].stuID = i;
}
//将学生信息写入到文件里fwrite
size_t nWriteCount = fwrite(stus,sizeof(STU),STUNUM,fp);
//目的是确认, 是否正确定写入了所有内容
if (nWriteCount != STUNUM )
{
puts("write file error");
exit(1);
}
//关闭文件
fclose(fp);
return 0;
}
内容是定义了一个二维数组,还有一个结构体,用只输入name,其他内容自动生成的方式。
接下来是第二部分,使用fread读出来,验证下刚才写的内容是否正确
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STULEN 20
#define STUNUM 5
//构造表示学生类型的数据结构 struct
typedef struct students
{
char name[STULEN];
int age;
int stuID;
}STU;
int main(int argc,const char *argv[])
{
// 声明一个文件指针
FILE *fp = NULL;
// 打开文件指针
fp = fopen("/Users/qingyun/Desktop/stu.txt","r");
// 判断文件是否打开成功,如果失败则退出程序
if (NULL == fp)
{
puts("Open file error!");
exit(1);
}
// 声明一个缓冲区,用于存放文件的内容
STU stus[STUNUM] = {0};
// 若打开成功,则使用 fread 来读取文件内容
int nReadCounts = fread(stus,sizeof(STU),STUNUM,fp);
// 根据文件函数的返回值来判断文件是否读成功了
if (nReadCounts != STUNUM)
{
puts("Read file error!\n");
exit(1);
}
//若读取成功的话,打印到屏幕上
for (int i = 0;i < STUNUM;i++)
{
printf("the [%d] student info:name is %s,age is %d,stuID is %d\n",i,stus[i].name,stus[i].age,stus[i].stuID);
}
// 关闭文件指针
fclose(fp);
return 0;
}
附上显示结果
the [0] student info:name is zhangsan,age is 20,stuID is 0
the [1] student info:name is lisi,age is 21,stuID is 1
the [2] student info:name is wangeu,age is 22,stuID is 2
the [3] student info:name is zhaoliu,age is 23,stuID is 3
the [4] student info:name is xiaoqi,age is 24,stuID is 4