目录
文件分类
程序文件
数据文件
文件的打开和关闭
文件指针
文件的顺序读写
文件读取结束的判定
文件缓冲区
文件版通讯录
实现代码
注意事项
编辑
编辑
实现效果
文件分类
磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 或者输出内容的文件。
文件的打开和关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
文件指针
FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
文件的顺序读写
文件读取结束的判定
牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c; // 注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
}
文件缓冲区
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题
文件版通讯录
实现代码
该版本通讯录在动态增长版本的基础上增加了加载函数以及退出保存函数,实现了通讯录的载入数据功能和退出保存数据功能
void LoadContact(Contact* pc)
{
//打开文件
FILE* pf = fopen("contact.dat", "rb");
if (pf == NULL)
{
perror("LoadContact");
return;
}
//读文件
PeoInfo tmp = { 0 };
while (fread(&tmp, sizeof(PeoInfo), 1, pf))
{
if (0 == CheckSz(pc))
return;
pc->date[pc->count] = tmp;
pc->count++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//初始化通讯录函数动态
void InitContact(Contact* pc)
{
assert(pc);
PeoInfo* ptr = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
if (ptr ==NULL)
{
perror("InitContact:");
return;
}
else
{
pc->date = ptr;
pc->count = 0;
pc->sz = DEFAULT_SZ;
}
//文件中保存的信息加载到通讯录中
LoadContact(pc);
}
void SaveContact(Contact* pc)
{
FILE* pf = fopen("contact.dat", "wb");
if (pf == NULL)
{
perror("SaveContact");
return;
}
//写数据
int i = 0;
for (i = 0; i < pc->count; i++)
{
fwrite(pc->date + i, sizeof(PeoInfo), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
注意事项
第一次运行报错
第一次运行报错是因为没有数据可以加载
而不影响使用是因为rb不会主动创建文件
是否能用wb 不能!!!
如果用wb 运行程序会创建文件 导致之前保存文件被覆盖,读取失败!
实现效果
载入了之前所存储的名单