1,为什么使用文件
首先要知道无论是我们写的程序运行还是要进入某些软件,都会伴随着大量程序在内存中运行,而当我们退出程序或者关机时内存就会清空,如果将数据存储在内存中显然是不行的,其实这些程序数据全都存储在硬盘中,以文件的形式展现给我们。
2,什么是文件
存储在硬盘中的文件就是文件,
从文件功能角度分为:程序文件,数据文件
2.1程序文件
程序文件包括:源文件(.c为后缀),目标文件(.obj为后缀windows下),可执行文件(.exe windows下)
2.2数据文件
其内容可以是程序,也可以是程序运行中读取的数据或输出的数据
2.3文件名
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如:
c:\code\test.txt
为了⽅便起⻅,⽂件标识常被称为⽂件名。
3.二进制文件和文本文件
根据数据的组织形式 数据文件可以分为二进制文件和文本文件。
数据在内存中以二进制存储,如果不加以转换输出到外存(
硬盘)中,叫
二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是文本文件
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节。
4.文件的打开和关闭
4.1流和标准流
4.11流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
4.12标准流
我们从键盘上输入数据或向屏幕上输出数据也打开了流,通过打开输入流用键盘像程序中输入数据,打开输出流像屏幕输出程序结果。这两种流就是标准流。
•
stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
•
stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。
•
stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
我们使用scanf ,printf 时就默认打开了这三个流
4.2文件指针
每一个文件的使用都会在内存中开辟一个文件信息区,用来存放文件的各种信息(文件名,文件状态等),这些信息存储在一个结构体中,该结构体由系统命名为FILE。
而想要取得结构中的信息就必须要有一个指针指向这个结构,该指针叫文件指针。
4.3文件的打开和关闭
用两个函数来实现文件的打开和关闭。fopen和close
fopen:打开一个文件并返回该文件的文件指针,参数:文件名和打开方式(读,写)
close:关闭文件,通过文件指针
打开方式:
5.文件的顺序读写
5.1顺序读写函数
5.2对比一组函数
//scanf /fscanf/sscanf
//printf / fprintf/sprintf
#include<stdio.h>
struct S
{
int a;
float s;
char c[10];
};
int main()
{
int n = 0;
FILE* pf = fopen("data.txt", "r");
FILE* pt = fopen("next.txt", "w");
struct S s = { 100,3.14f,"haha" };
char arr[30];
//scanf格式化标准输入流
scanf("%d", &n);
//printf格式化标准输出流
printf("%d", n);
//fscanf格式化所有输入流
fscanf(pf, "%d", &n);
//fprintf格式化所有输出流
fprintf(pt, "%d", n);
//sscanf从字符串中读取数据格式化存储
sscanf(arr, "%d %f %s", &(s.a), &(s.s), &(s.c));
//sprintf将格式化的数据输出到一个字符串中
sprintf(arr, "%d %f %s", s.a, s.s, s.c);
return 0;
}
6.文件的随机读写
1.fseek
2.ftell
计算相对起始位置的偏移量
3.rewind
让⽂件指针的位置回到⽂件的起始位置
7.文件缓冲区
ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的⼤⼩根据C编译系统决定的。