Skip to content

打开/关闭文件

打开文件

文件的打开操作表⽰将给用户指定的文件在内存分配一个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");

第二个参数的几种形式(打开文件的⽅式)

打开模式含义
rrb以只读⽅式打开一个文本文件(不创建文件,若文件不存在则报错)
wwb以写⽅式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
aab以追加⽅式打开文件,在末尾添加内容,若文件不存在则创建文件
r+rb+以可读、可写的⽅式打开文件(不创建新文件)
w+wb+以可读、可写的⽅式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a+ab+以添加⽅式打开可读、可写的文件。若文件不存在则创建文件;如果文件存在,则写⼊的数据会被加到文件尾后,即文件原先的内容会被保留。

注意:

  • b是二进制模式的意思,b只是在Windows有效,在Linux用rrb的结果是一样的
  • 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;
}