一、为什么与是什么
写程序的时候,如果数据只是储存在内存中,一旦退出程序数据就被删除,每次打开又要重新录入数据,无法做到永久保存。
于是聪明的人类发明了磁盘以及数据库用于存放数据。而我们常把磁盘中的文件就简称为文件。
二、分类
(按照功能的角度)
分为程序文件和数据文件
【程序文件】
源程序文件(.c)
目标文件(.obj)
可执行文件(.exe)
(后缀为Windows环境下)
【数据文件】
程序运行时用于读写数据
当我们把信息输入到磁盘上,在把磁盘上读取到的信息用于程序中就是在处理磁盘上的文件
数据文件又分为文本文件和二进制文件
文本文件:ASCII码的形式存储
二进制文件:以二进制的形式存储
三、怎么玩
先来了解一个概念
【文件指针】
又称文件类型指针,用 FILE 来表示
每个使用的文件都会有一个存放对应信息(文件名/文件状态/文件位置)的信息区放在内存中,具体来说,这些信息存放在一个系统自动创建的结构体变量中,FILE就是指向这块区域的指针。
请问喝牛奶分几步?
3步:打开牛奶,喝牛奶,盖好盖子
那么,文件的操作分几步?
3步:打开文件,使用文件,关闭文件
1. 文件的打开和关闭
注意:这是必须操作的步骤,而不是选做的。
FILE * fopen ( const char * filename, const char * mode ); //打开文件
int fclose ( FILE * stream );//关闭文件
ps:其中的mode表示文件的打开方式,一般有以下这些
文本文件:r只读 / w只写 / a追加
r+读写打开 / w+读写建立 / a+文件尾读写
二进制文件:rb只读 / wb只写 / ab追加
rb+读写打开 / wb+读写建立 / ab+文件尾读写
*文件打开时未设置路径则默认当前工作路径
直接看例子可能会更好理解一些
【例子】
#include <stdio.h>
int main () {
FILE * pFile;
//打开文件
pFile = fopen ("myfile.txt","w");
if (pFile!=NULL)
{
fputs("fopen example",pFile); //文件操作
fclose(pFile);//关闭文件
}
return 0;
}
2. 文件的顺序读写
功能 | 函数名 |
---|---|
字符输入函数 | fgetc |
字符输出函数 | fputc |
文本行输入函数 | fgets |
文本行输出函数 | fputs |
格式化输入函数 | fscanf |
格式化输出函数 | fprintf |
二进制输入 | fread |
二进制输出 | fwrite |
*前8个适用于所有输入输出流,最后2个适用于文件
以之前文章中的通讯录为例,更加详细的内容可见之前发过的文章
void LoadContact(Contact* pc)
{
FILE* pf = fopen("Contact.txt", "rb");//打开文件,以读取二进制文件的形式
if (pf == NULL)
{
perror("LoadContact");//打印错误信息
return;
}//打开失败判断
Peoinfo tmp = { 0 };
while (fread(&tmp, sizeof(Peoinfo), 1, pf))
//fread参数解读:读取到的数据存放的地址,读取数据的大小,读取数据的个数,读取数据的位置
{
CheckCapacity(pc);
//读取文件信息
pc->data[pc->sz] = tmp;
pc->sz++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
void SaveContact(Contact* pc)
{
FILE* pf = fopen("contact.txt", "wb");//以输入数据的方式打开文件
if (pf == NULL)
{
perror("SaveContact");
return;
}
//写信息到文件
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//fwrite(&(pc->data[i]), sizeof(PeoInfo), 1, pf);
fwrite(pc->data+i, sizeof(PeoInfo), 1, pf);//参数类似fread
}
fclose(pf);//关闭文件!!!千万要记得!!!
pf = NULL;//并且把指针置空
}