前言
本篇博客讲解对文件的操作,包括打开,关闭操作。在下篇博客将讲解文件的读写。
文件是计算机系统中用于存储数据的基本单位。它可以包含文本、图像、音频、视频等各种类型的信息。文件通常以某种特定的格式存储,这个格式决定了文件中数据的组织方式,以及如何解释和处理这些数据。
在计算机编程和脚本语言中,通常会使用多种类型的文件。以下是一些常见的文件类型:
还有许多种文件类型,这里不再一一列举。
一个文件要有一个唯一的文件标识,以便用户识别和引用。
⽂件名包含3部分:⽂件路径+⽂件名主干+⽂件后缀
例如:c:\code\test.txt
为方便起见,文件标识常被称为文件名。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是文本文件。
在计算机编程和操作系统中,**“流”(stream)是一种用于在程序之间传输数据的抽象概念。**流可以用于输入(读取数据)和输出(写入数据),它们通常表示为一个序列化的数据流,可以是字节、字符或其他数据单元的连续流。
有两种主要类型的流:输入流和输出流。此外,有一种特殊类型的流称为标准流,它用于在程序和操作系统之间进行标准输入和标准输出。
文件操作通常涉及到内存中的一个FILE结构体变量,该结构体用于存储有关打开文件的相关信息。这个FILE结构体类型是由C标准库(如
)定义的。
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;//将struct _iobuf重命名为FILE
//以上是在C语言标准库中声明的,我们只需使用即可
FILE* pf1;//创建⽂件指针变量,pf是⼀个指向FILE类型数据的指针变量。
这些成员的确切定义和实现可能因操作系统和编译器的不同而有所不同。每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关心细节。
在读写文件时,需要先打开文件,然后进行读写,最后需要关闭文件。
在打开和关闭文件时,需要用到两个函数fopen和fclose
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );//filename是文件名,mode表示文件打开的模式
//关闭⽂件
int fclose ( FILE * stream );//stream是一个文件指针
文件打开模式, 如下:
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输⼊数据,打开⼀个已经存在的⽂本⽂件 | 出错 |
“w”(只写) | 为了输出数据,打开⼀个⽂本⽂件 | 建⽴⼀个新的⽂件 |
“a”(追加) | 向⽂本⽂件尾添加数据 | 建⽴⼀个新的⽂件 |
“rb”(只读) | 为了输⼊数据,打开⼀个⼆进制⽂件 | 出错 |
“wb”(只写) | 为了输出数据,打开⼀个⼆进制⽂件 | 建⽴⼀个新的⽂件 |
“ab”(追加) | 向⼀个⼆进制⽂件尾添加数据 | 建⽴⼀个新的⽂件 |
“r+”(读写) | 为了读和写,打开⼀个⽂本⽂件 | 出错 |
“w+”(读写) | 为了读和写,建议⼀个新的⽂件 | 建⽴⼀个新的⽂件 |
“a+”(读写) | 打开⼀个⽂件,在⽂件尾进⾏读写 | 建⽴⼀个新的⽂件 |
“rb+”(读写) | 为了读和写打开⼀个⼆进制⽂件 | 出错 |
“wb+”(读写) | 为了读和写,新建⼀个新的⼆进制⽂件 | 建⽴⼀个新的⽂件 |
“ab+”(读写) | 打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写 | 建⽴⼀个新的⽂件 |
示例:
/* fopen fclose example */
#include
int main(){
FILE* pFile;
//打开⽂件
pFile = fopen("myfile.txt", "w");//"w"表示只写
//⽂件操作
if (pFile != NULL){
fputs("fopen example", pFile);
//关闭⽂件
fclose(pFile);
}
return 0;
}