1、文件操作的步骤:
① 打开文件 -----将应用程序和文件建立关联
② 读、写文件操作
读操作: 将文件中的数据加载到程序
写操作: 将程序中的数据保存到文件
③ 关闭文件
2、通过函数操作文件
2.1 打开文件
FILE *fopen(const char *pathname, const char *mode);
函数功能: 打开文件
参数说明:
pathname:文件路径
mode:打开模式 (文本文件操作的方式: r w a, 二进制文件操作的方式:rb wb ab)
返回值: 成功返回结构体的起始起始
失败返回NULL
注意:
① 以读的方式打开文件,如果文件不存在,打开失败!
② 以写的方式打开文件,如果文件不存在,创建文件,如果文件存在,清空文件中所有的内容
③ 以追加的方式打开文件,如果文件不存在,创建文件, 如果文件存在,不清空内容,文件指针指向内容的最后
FILE *fp = NULL;
//fp = fopen("./data.txt", "rb");
//fp = fopen("./data.txt", "wb");
fp = fopen("./data.txt", "ab");
if(NULL == fp) //打开文件失败
{
perror("fopen");
return -1;
}
2.2 读文件
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数说明: 以二进制的方式读文件
参数说明:
ptr:存放读数据内存的起始地址
size :数据的单位大小
nmemb: 读数据的个数
stream : 文件指针
返回值:返回值等于0 ,表示到达文件结尾!!!!
int data[100];
int temp;
int i = 0;
int ret;
while(1)
{
ret = fread(&temp, sizeof(int), 1, fp);
if(0 == ret) //说明到达文件结尾
{
break;
}
data[i] = temp;
i ++;
}
2.3 写文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函数功能: 以二进制的方式写文件
参数说明:
ptr: 写数据的起始地址
size: 数据的单位大小
nmemb:数据的个数
stream: 文件指针
返回值:返回成功写进去的个数
int data[5] = {1,2,3,4,5};
int ret;
ret = fwrite(data, sizeof(int), 5, fp);
if(ret<5)
{
perror("fwrite");
return -1;
}
2.4 关闭文件
fclose(FILE *stream);
参数说明:stream -- 这是指向 FILE 对象的指针
3、综合练习
定义结构体, 表示学生的基本信息: 学号 姓名 成绩
要求:
1、从键盘输入5个学生的信息, 存储到文件
2、从文件中读取所有学生的信息, 输出打印
3、读写操作封装成两个函数
#include <stdio.h>
struct student
{
int num;
char name[32];
double score;
};
//成功: 0
//失败: -1
int write_file(struct student s[], int n)
{
FILE *fp = NULL;
//1、打开文件
fp = fopen("./stu.txt", "wb");
if(NULL == fp)
{
perror("fopen");
return -1;
}
//2、写文件
int ret;
for(int i=0; i<n; i++)
{
ret = fwrite(&s[i], sizeof(struct student), 1, fp);
if(ret<1)
{
perror("fwrite");
fclose(fp);
return -1;
}
}
//3、关闭文件
fclose(fp);
return 0;
}
//成功: 返回正确读到的学生个数
//失败: 返回-1
int read_file(struct student s[], int n)
{
//1、open file
FILE *fp = NULL;
fp = fopen("./stu.txt", "rb");
if(NULL == fp)
{
perror("fopen");
return -1;
}
//2、read file
int i = 0;
int ret ;
#if 0
while(1)
{
ret = fread(&s[i], sizeof(struct student), 1, fp);
if(0 == ret)
{
break;
}
i ++;
}
#endif
while(fread(&s[i], sizeof(struct student),1, fp))
{
i ++;
if(i > n)
{
printf("内存已经越界!");
fclose(fp);
return -1;
}
}
//3、close file
fclose(fp);
return i;
}
int main01()
{
struct student s[5] = {
{1001, "zhangsan1", 90},
{1002, "zhangsan2", 89},
{1003, "zhangsan3", 78},
{1004, "zhangsan4", 88},
{1005, "zhangsan5", 99}
};
write_file(s, 5);
return 0;
}
int main()
{
struct student s[100];
int count;
count = read_file(s, 100);
for(int i=0; i<count; i++)
{
printf("%d\t%s\t%.2lf\n", s[i].num, s[i].name, s[i].score);
}
return 0;
}