文章目录
- 前言
- 一、什么是文件
- 1.1 程序文件
- 1.2 数据文件
- 二、文件的打开与关闭
- 2.1 文件指针
- 2.2 文件的打开与关闭
- 2.3 文件读写详情表!(重点)
- 2.4 文件的顺序读写!(重点)
- 2.5 文件的随机读写
- 2.5.1 fseek
- 2.5.2 ftell
- 2.6 文本文件与二进制文件
前言
文件,我们学习C最后都要与实体进行交互,面向端往往取决于需求,而之前好像一直在写一些仅仅给自己看的小逻辑,并没有完全可以保存下来,比如保存成电脑中文件的样子的文件。
本章主要介绍如何去与自己的计算机进行交互,前几天发布的通讯录并没有记忆功能,每次运行都需要重新输入数据,然后去进行删除、显示、查看等等的操作,本章介绍的就是如果将这些内容保存到自己的电脑中,创建出一个文件
一、什么是文件
- 一般在程序中我们将文件分为两种:程序文件、数据文件。
1.1 程序文件
- 源程序文件,后缀为.c
打开可以直接进入编译器

- 目标文件,在windows上后缀为.obj
这是在我们windows下的文件

- 可执行程序,windows下后缀为exe

1.2 数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件
这也是本文主要探讨的文件。
二、文件的打开与关闭
2.1 文件指针
一般这种都是在库函数中有声明的,在我所用的vs2013版本里声明在 #include<stdio.h> 中
一般这类结构体变量都取名为 FILE
2.2 文件的打开与关闭
文件在读写之前先需要打开文件,用完之后要手动关闭文件
例:
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
//打开文件与关闭文件必须成对出现
int fclose ( FILE * stream );
2.3 文件读写详情表!(重点)
| 文件使用方式 | 含义 | 如果指定文件不存在 |
|---|---|---|
| “r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
| “w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
| “a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
| “rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
| “wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
| “ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
| “r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
| “w+”(读写) | 为了读和写,建立一个新的文件 | 建立一个新的文件 |
| “a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
| “rb+”(读写) | 为了读和写,打开一个二进制文件 | 出错 |
| “wb+”(读写) | 为了读和写,新建了一个新的二进制文件 | 建立一个新的文件 |
| “ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
新建文件演示
//引用库函数
#include<stdio.h>
int main()
{FILE* pfw;//建立一个新的文件,之前并不存在的文件pfw=fopen("text.txt","w");//查看是否开辟成功if(pfw==NULL){perror("fopen example::text.txt");teturn;}//关闭文件fclose(pfw);return 0;
}
2.4 文件的顺序读写!(重点)
| 功能 | 函数名 | 适用于 |
|---|---|---|
| 字符输入函数 | fgets | 所有输入流 |
| 字符输出函数 | fputc | 所有输出流 |
| 文本行输入函数 | fgets | 所有输入流 |
| 文本行输出函数 | fputs | 所有输出流 |
| 格式化输入函数 | fscanf | 所有输入流 |
| 格式化输出函数 | fprintf | 所有输出流 |
| 二进制输入 | fread | 文件 |
| 二进制输出 | fwrite | 文件 |
选择自己所需要的输出输入格式
实机演示
//之前的通讯录中实现信息的存储
void loadContact(struct Contact* pc)
{//查pcassert(pc);//开辟文件,并准备写入数据FILE* pfw = fopen("data.txt", "rb");if (pfw == NULL){perror("Contact.loadContact::fopen");return;}int i = 0;//依次写入通讯录中每组数据for (i = 0; i <= pc->sz; i++){fread(pc->data + i, sizeof(struct strtact), i, pfw);}//关闭文件fclose(pfw);pfw = NULL;
}
2.5 文件的随机读写
2.5.1 fseek
根据文件指针的位置和偏移量来定位文件指针
fseek
int fseek ( FILE * stream, long int offset, int origin );
例**
int main ()
{FILE * pfw;pfw = fopen ( "text.txt" , "wb" );fputs ( "This is an apple." , pfw );fseek ( pfw , 3 , SEEK_SET );fputs ( " sam" , pfw );fclose ( pfw );return 0;
}
2.5.2 ftell
指定读取文件指针时相对于起始位置的偏移量
long int ftell(FILE* stream);
例
#include <stdio.h>
int main ()
{FILE * pFile;long size;//打开文件pFile = fopen ("myfile.txt","rb");if (pFile==NULL)perror ("Error opening file");else{//读取文件fseek (pFile, 0, SEEK_END);size=ftell (pFile);//关闭文件fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}
2.6 文本文件与二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。
存入的文本文件



















