一、文件的介绍
1.1 文件分类
在程序设计中,从文件的功能分类可以分为程序文件和数据文件。
程序文件:包括源文件(.c)、目标文件(.obj)、可执行文件(.exe)。
数据文件:程序运行时读写的文件。
1.2 文件路径
在C语言中,处理文件路径通常涉及到在程序中指定文件的位置,以便可以打开、读取、写入或执行其他文件操作。文件路径可以是相对路径或绝对路径。
绝对路径
绝对路径是从根目录(或顶级目录)开始到文件所在位置的完整路径。它包含所有必要的目录和子目录,以及文件名本身。绝对路径在不同的操作系统中可能有所不同:
- 在Windows中,绝对路径可能类似于
C:\Users\YourName\Documents\file.txt
。 - 在Unix/Linux/macOS中,绝对路径可能类似于
/home/yourname/documents/file.txt
。
相对路径
相对路径是相对于当前工作目录的路径。如果你在一个程序中指定了一个相对路径,那么文件将被假定为位于程序当前工作目录的某个子目录中,或者就在当前工作目录中。
- 例如,如果你的程序当前工作目录是
/home/yourname/projects
,并且你指定了一个相对路径./data/file.txt
(其中.
代表当前目录),那么程序将尝试打开/home/yourname/projects/data/file.txt
1.3 文件名
在C语言中,文件名是指用于标识和引用存储在文件系统中的文件的字符串。这个字符串可以是绝对路径或相对路径,但无论哪种情况,它最终都指向一个具体的文件。文件名通常包括三部分:文件路径+文件名主干+文件后缀。
注意事项
- 当在C程序中指定文件名时,请确保路径和文件名正确无误,并且文件确实存在于指定的位置。
- 在Windows上,路径分隔符是反斜杠(
\
),但在C字符串中,反斜杠是一个转义字符的开始。因此,你需要使用双反斜杠(\\
)来表示一个实际的反斜杠字符。或者,你可以使用正斜杠(/
),它在Windows上也被接受为路径分隔符。
二、文件的打开和关闭
2.1 文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名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结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。下面我们可以创建一个FILE*的指针变量:FILE* pf
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
下面这个图片希望可以帮助大家理解:
2.2 文件的打开和关闭
在C语言中,文件的打开和关闭是通过标准I/O库中的函数来完成的。这些函数定义在stdio.h
头文件中,使得程序能够执行文件操作,如打开、读取、写入和关闭文件。
2.2.1 文件的打开
文件打开操作是通过fopen
函数来完成的,函数原型为FILE *fopen(const char *filename, const char *mode),第一个参数是指所要打开的文件的名称,第二个参赛是文件打开方式,如果文件成功打开,fopen
将返回一个指向FILE
对象的指针,该对象用于后续的文件操作。如果文件打开失败(例如,因为文件不存在或没有足够的权限),则返回NULL。
文件的打开有以下几种:
- 只读模式:
"r"
:以只读方式打开文件。文件必须存在。"rb"
:以二进制只读方式打开文件。文件必须存在。
- 只写模式:
"w"
:以只写方式打开文件,如果文件存在则长度被截断为零,即该文件内容会消失。如果文件不存在则创建该文件。"wb"
:以二进制只写方式打开文件,同上。
- 追加模式:
"a"
:以追加方式打开文件。如果文件不存在,将会创建该文件。如果文件存在,写入的数据会被追加到文件末尾,即文件原有内容不会被覆盖。"ab"
:以二进制追加方式打开文件,同上。
- 读写模式:
"r+"
:以读写方式打开文件。该文件必须存在。"rb+"
:以二进制读写方式打开文件,该文件必须存在。"w+"
:以读写方式打开文件,如果文件存在则文件长度被截断为零,即该文件内容会消失。如果文件不存在则创建该文件。"wb+"
:以二进制读写方式打开文件,同上。"a+"
:以读写方式打开文件,该文件可以是存在的或不存在的。写操作将数据追加到文件末尾,但读操作可以从文件的开头开始。"ab+"
:以二进制读写方式打开文件,同上。
- 特殊模式(并非所有系统都支持):
"x"
:以独占方式创建文件并以写模式打开该文件。如果文件已存在,则fopen
调用失败并返回NULL
。"xb"
:以二进制独占方式创建文件并以写模式打开该文件,同上。
2.2.2 文件的关闭
文件关闭操作是通过fclose
函数来完成的。fclose
函数的原型为:int fclose(FILE *stream)
stream
是指向FILE
对象的指针,该对象标识了要关闭的文件。
fclose
函数会关闭与stream
相关联的文件,并释放所有与之相关的资源。如果成功,fclose
返回0
;如果失败,则返回EOF
(通常是一个在stdio.h
中定义的宏,表示文件结束或错误)。