C语言之文件操作(上)
文章目录
- C语言之文件操作(上)
- 1. 什么是⽂件?
- 1.1 程序⽂件
- 1.2 数据⽂件
- 1.3 ⽂件名
- 2. ⼆进制⽂件和⽂本⽂件
- 3. ⽂件的打开和关闭
- 3.1 流和标准流
- 3.1.1 流
- 3.1.2 标准流
- 4. ⽂件指针
- 5. 文件的打开与关闭
1. 什么是⽂件?
磁盘上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)
1.1 程序⽂件
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)
1.2 数据⽂件
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件
1.3 ⽂件名
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
为了⽅便起⻅,⽂件标识常被称为⽂件名
2. ⼆进制⽂件和⽂本⽂件
数据⽂件又被称为⽂本⽂件或者⼆进制⽂件
- 数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件
- 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储
例如:10000如果以ASCII形式存储,则磁盘占5个字节(一个字符为1个字节),而以二进制形式存储,则磁盘占4个字节(一个整型)
ASCII形式存储:将每个字符转为对应的ASCII值,在将对应ASCII值转为二进制
二进制形式存储:将值转为二进制形式
3. ⽂件的打开和关闭
3.1 流和标准流
3.1.1 流
在输入/输出数据的时候会输入/输出到不同的设备中,不同设备的输入/输出是以不同的方式的,为了方便程序员的操作,我们抽象出了流的概念,我们可以把流想象成流淌字符的河流
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作
3.1.2 标准流
C语言在程序启动时,默认开打了三种流:
stdin — 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据
stdout — 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中
stderr — 标准错误流,⼤多数环境中输出到显⽰器界⾯
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr三个流的类型是: FILE*,通常称为⽂件指针。
C语⾔中,就是通过FILE* 的⽂件指针来维护流的各种操作的
4. ⽂件指针
缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE
在VS2013编译环境提供的 stdio.h 头⽂件中有以下的⽂件类型申明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异
不用关系这段代码是如何实现的,当我们打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节
5. 文件的打开与关闭
⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
filename为文件的路径
mode为打开方式(只读,只写,…)
stream 为文件指针
mode模式有以下几种:
注意:
- 当任意读取文件的方式读取不存在的文件时,将会报错
- 打开文件也是有返回值的,当打开失败会返回一个NULL指针,所以最好对返回值进行判断
- 和动态内存管理相似,开辟空间需要free释放,同理打开文件也需要关闭文件fclose,并且将文件指针置NULL
示例:
#include <stdio.h>
int main()
{
FILE* pf = fopen("test.txt","r");//只读方式打开文件
fclose(pf);//关闭文件
return 0;
}