Ⅰ 什么是文件?
存放在磁盘上的文件就是文件。
在程序设计中我们一般将文件分为两类:程序文件和数据文件(按文件的功能分类)。
1.程序文件
包括源程序文件(后缀为.c),目标文件(Windows环境后缀为.obj),可执行文件(Windows环境后缀为.exe)。
2.数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
我们编写的文本文件(.c源程序),和编译后形成的二进制文件(.obj目标文件,.exe可执行文件)。常用的文档,音视频文件都是以这种形式存储在磁盘上的
Ⅱ 文件的性质
文件是一个有序的数据序列。文件的所有数据之间有着严格的排列次序的关系(类似数组类型的数
据),要访问文件中的数据必须按照它们的排列顺序依次进行访问。
Ⅲ 系统对文件的处理过程
在计算机中所有运行的程序必须载入到内存中才能正常的运行和处理。
因此系统必须有一个过程实现内存与外存的数据交换。通常这样一个过程是通过文件缓冲区来进行的。
我们将文件缓冲区中的数据存储在外存上称为写文件或者说文件的输出。将外存中的文件读取到缓冲区中供文件使用叫做读文件或者文件的输入。
在C语言中,"文件"的概念具有广泛的意义。它把与主机进行数据交换的输入输出设备都看作是一个文件 (例如我们平常使用的打印机显示器和键盘等本质上来说都是产生和消费数据的设备)。即把实际的物理设备抽象为逻辑文件,它们也被称为设备文件
例如: 键盘作为标准输入文件 文件名stdin
显示器作为标准输出文件 文件名是stdout
打印机也作为输出文件 文件名是PRN
根据对文件的处理方式可将文件分为两类:
1.缓冲文件系统
对每个正在使用的文件系统自动在内存中为其开辟一个文件缓冲区,程序对文件的处理是通过缓冲区间接进行的。也称为高级文件操作。
2.非缓冲文件系统
系统不会自动开辟文件缓冲区而是由应用程序自己设置(也就是程序员自己编程实现)。也称为低级文件操作。
在83年以后ANSIC标准中取消了非缓冲文件系统,对文本文件和二进制文件均统采用缓冲文件系统进行处理
Ⅳ 文件指针
C语言的文件读写通常采用缓冲文件系统,也就是说我们不能直接访问硬盘的数据。
而要通过打开文件的方式将磁盘文件或者设备文件的数据缓冲到内存中。这个内存数据需要通过FILE文件结构变量进行管理和维护,而维护是由系统内部进行的。留给编程人员的就是一个文件指针及其相应的操作函数。
文件结构FILE的定义,里面包含了我们使用一个缓冲区数据所关心的东西
typedef struct
{
short level; //文件缓冲区中剩余的字节数
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned char hold; //缓冲区满时丢失的字符
short bsize; //文件缓冲区大小
unsigned char *buffer; //文件缓冲区地址
unsigned char *curp; //文件读写下一个字符位置
unsigned istemp; //临时文件指针
short token; //校验符
}FILE;
文件指针变量
文件结构已由系统定义,它是由系统自动生成的。在C程序后续操作中都要通过指向该文件结构的指针对已打开的文件进行操作。为此需要在程序中对每个要打开的文件定义一个FILE类型(文件型)的指针变量
文件型指针变量说明形式
FILE**文件型指针变量名;
例如:FILE *fp;
fp是一个指针变量,指向文件结构
系统标准设备文件
标准设备文件是由系统控制,由系统自动打开和关闭。标准设备文件的文件结构的指针变量由系统命名,用户在程序中可直接使用。
C语言中提供了三个标准设备文件的指针:
stdin 标准输入文件(键盘)
stdout 标准输出文件(显示器)
stderr 标准错误输出文件(显示器)
Ⅴ 使用文件的一般步骤
打开文件——读/写文件——关闭文件
Ⅵ 文件操作——打开和关闭
>文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
>ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。
>在编写程序的时候,在打开文件的同时,fopen函数都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
文件指针的使用:
FILE* pf;
定义一个文件指针变量pf,它可以指向某个文件的文件信息区,通过其即可访问到该文件。
底层原理:每个被使用的文件,都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如:文件名、文件状态、文件位置等),这些信息被保存到一个结构体中,系统为其声明为FILE,每当打开一个文件的时候,系统就会根据情况自动创建一个FILE结构的变量,并且通过FILE*的指针来维护这个结构。
- fopen() —— 打开文件;
- FILE * fopen ( const char * filename, const char * mode );//文件名,使用方式
- fclose() —— 关闭文件;
- int fclose ( FILE * stream );
使用文件的方式
文件的顺序读写
以写的方式打开一个名字为test.txt的文件
#include <stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "w");//以写的方式打开文件
//判断文件是否打开
if (pf == NULL)
{
perror("fopen");
return 1;
}
//使用
//。。。。
//关闭文件
fclose(pf);
pf = NULL;//失忆
return 0;
}
注意:
- 以写的方式打开一个文件时
- 如果这个文件不存在,则会创建一个该名字的文件
- 如果这个文件已经存在,在打开的同时将会清空文件中的内容,当写入数据的时候是从头开始写的。
- 一定要对打开文件后返回的指针进行有效性判断,防止对NULL空指针进行使用
- 文件使用结束后一定要关闭文件
关闭文件:
int fclose ( FILE * stream );
- 形参:是一个FILE*类型的文件指针变量,用于接收打开文件后返回的指针。
- 返回类型:是一个int类型
- 关闭成功的话会返回0
- 关闭失败的话返回EOF
一个以读的方式开的例子
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//使用
fclose(pf);
pf = NULL;
return 0;
}
注意:
- 以读的方式打开一个文件时
- 如果这个文件存在,则直接打开
- 如果这个文件不存在,则报错,返回一个空指针NULL
- 同样再最后一定要关闭文件
显示文件的内容
#include<stdio.h>
main(){
FILE *fp; //建立一个文件指针
char filename[20],ch;
printf("Enter filename:");
scanf("%s",filename); //输入文件名
if((fp=fopen(filename,"r"))==NULL){ //打开文件将结果赋值给fp
printf("file open error.\n"); //出错处理
exit(0);
}
while((ch=fgetc(fp))!=EOF){ //从文件读字符直到文件结束
//putchar() 在显示器上当前位置显示对应的ch字符,也可以用下面的fputc
fputc(ch,stdout);
//向一个文件中写入字符,显示器也是一种特殊的文件,它的标准文件指针是stdout。我们通过fputc向stdout这个文件写入字符,与刚才直接使用putchar()输出的效果是一样的,只是这里将显示器作为一个特殊的文件来处理
} //关闭文件
fclose (fp);
}
//EOF为文件结束标记。同时也是读取成功的标志,读取成功不会返回EOF字符
未完待续......
在此对诸位大佬表示感谢!
参考链接:https://blog.csdn.net/weixin_63726869/article/details/125909495
参考链接:https://blog.csdn.net/m0_65190367/article/details/126682477
参考链接:https://blog.csdn.net/zimuzi2019/article/details/106108954
参考链接:https://blog.csdn.net/m0_70811813/article/details/127218742