打开/关闭文件
打开文件
文件的打开操作表⽰将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返 回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打 开函数时,必须给出文件名、文件操作⽅式(读、写或读写)。任何文件使用之前必须打开:
c
#include <stdio.h>
FILE * fopen(const char * filename, const char * mode);
功能:打开文件
参数:
filename
:需要打开的文件名,根据需要加上路径mode
:打开文件的模式设置
返回值:
- 成功:文件指针
- 失败:
NULL
第一个参数的⼏种形式
c
FILE* fp_passwd = NULL;
//相对路径:
//打开当前目录passdw文件:源文件(源程序)所在目录
FILE* fp_passwd = fopen("passwd.txt", "r");
//打开当前目录(test)下passwd.txt文件
fp_passwd = fopen(". / test / passwd.txt", "r");
//打开当前目录上一级目录(相对当前目录)passwd.txt文件
fp_passwd = fopen(".. / passwd.txt", "r");
//绝对路径:
//打开C盘test目录下一个叫passwd.txt文件
fp_passwd = fopen("c:/test/passwd.txt", "r");
第二个参数的几种形式(打开文件的⽅式)
打开模式 | 含义 |
---|---|
r 或rb | 以只读⽅式打开一个文本文件(不创建文件,若文件不存在则报错) |
w 或 wb | 以写⽅式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件) |
a 或ab | 以追加⽅式打开文件,在末尾添加内容,若文件不存在则创建文件 |
r+ 或 rb+ | 以可读、可写的⽅式打开文件(不创建新文件) |
w+ 或 wb+ | 以可读、可写的⽅式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件) |
a+ 或 ab+ | 以添加⽅式打开可读、可写的文件。若文件不存在则创建文件;如果文件存在,则写⼊的数据会被加到文件尾后,即文件原先的内容会被保留。 |
注意:
b
是二进制模式的意思,b
只是在Windows有效,在Linux用r
和rb
的结果是一样的- Unix和Linux下所有的文本文件行都是
\n
结尾,而Windows所有的文本文件行都是\r\n
结尾
在Windows平台下,以“文本”⽅式打开文件,不加b
:
- 当读取文件的时候,系统会将所有的 "
\r\n
" 转换成 "\n
" - 当写⼊文件的时候,系统会将 "
\n
" 转换成 "\r\n
" 写⼊ - 以"二进制"⽅式打开文件,则读写都不会进行这样的转换
在Unix/Linux平台下,“文本”与“二进制”模式没有区别,"\r\n
" 作为两个字符原样输⼊输出
c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp = NULL;
// "\\"这样的路径形式,只能在windows使用
// "/"这样的路径形式,windows和linux平台下都可用,建议使用这种
// 路径可以是相对路径,也可是绝对路径
fp = fopen("../test", "r");
//fp = fopen("..\\test", "w");
//返回空,说明打开失败
if (fp == NULL) {
//perror()是标准出错打印函数,能打印调用库函数出错原因
puts("打开失败");
perror("open");
return -1;
}
puts("打开成功");
printf("%p\n", fp);
return 0;
}
程序输出:
shell
打开失败
open: No such file or directory
应该检查fopen的返回值!如何函数失败,它会返回一个NULL值。如果程序不检查错误,这个 NULL指针就会传给后续的I/O函数。它们将对这个指针执行间接访问,并将失败。
关闭文件
文件操作完成后,如果程序没有结束,必须要用fclose()函数进行关闭,这是因为对打开的文 件进行写⼊时,若文件缓冲区的空间未被写⼊的内容填满,这些内容不会写到打开的文件 中。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从 而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件 得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的 缓冲区。
任何文件在使用后应该关闭:
- 打开的文件会占用内存资源,如果总是打开不关闭,会消耗很多内存
- 一个进程同时打开的文件数是有限制的,超过最⼤同时打开文件数,再次调用
fopen()
打开文件会失败 - 如果没有明确的调用
fclose()
关闭打开的文件,那么程序在退出的时候,操作系统会统一关闭
c
#include <stdio.h>
int fclose(FILE * stream);
功能:关闭先前fopen()
打开的文件。此动作让缓冲区的数据写⼊文件中,并释放系统所提供的文件资源。
参数:
stream
:文件指针
返回值:
- 成功:
0
- 失败:
-1
c
#include <stdio.h>
int main(){
FILE *fp = NULL;
fp = fopen("abc.txt", "r");
fclose();
return 0;
}