Logo

郎哥编程

文件的打开与关闭

2024-05-16 20

么是文件?

电脑中存储的图片、电影、动画、资料等都是以文件方式存储的,当编写需要存储和读取文件的程序时,就需要程序支持对文件的操作。文件操作包括文件的创建与删除、读取与写入、遍历与查找。

文件一般都存储在磁盘中,磁盘中的文件以目录树的方式组织起来,每一个目录就是一个存储文件的集合,目录下面又有子目录,形成层级目录树。当打开电脑查看某一盘符时,会看到盘符下有目录也有文件,其实盘符本身就是一个根目录,因此盘符下面既有目录也有文件。

文件的类型和结构可以根据其用途和内容而有所不同。例如,文本文件主要包含纯文本信息,通常用于存储文本文档、代码等。图像文件则包含像素数据和元数据,用于在屏幕上显示图像。视频文件则包含一系列图像帧和音频数据。

因此文件又分为文本文件和二进制文件,二进制文件和文本文件在物理存储上并没有什么区别,存储在硬盘上的文件都是以二进制方式存储的。二者的区别在于解释数据的逻辑不同。程序读取文本文件时,可以以字符方式读取,也可以以字节方式读取,将读取的数据解释为ASCII或unicode编码,也就是解释为字符,读取的字符可以直接输出到屏幕上显示出来;当程序读取二进制文件时,是以字节方式读取的,对读取数据的解释由读取程序决定。如读取图片文件时,读取图片的程序需要了解该文件的结构,并解释读取的数据,如果不了解该图片文件的结构,读取图片文件就会失败,也就无法把图片显示出来了。

文件结构体

C语言定义了FILE结构体来描述文件的信息,用来存放文件的文件的路径、名称,状态、缓冲区等信息。可以在stdio.h头文件里查看FILE结构体。

struct _iobuf {
        char *_ptr;  //文件输入的下一个位置
        int   _cnt;  //当前缓冲区的相对位置
        char *_base;  //文件的起始位置
        int   _flag;  //文件标志
        int   _file;  //文件的有效性验证
        int   _charbuf;  // 缓冲区状态
        int   _bufsiz;  //缓冲区大小
        char *_tmpfname;  //临时文件名
        };
typedef struct _iobuf FILE;

typedef是C语言的关键字,用来为数据类型或结构体定义一个别名。例如:FILE就是结构体 _iobuf的别名,结构体定义别名的好处是在声明结构体变量时,不需要加struct关键字。

FILE*  pFile; // 声明了一个结构体指针变量

文件打开与关闭操作

在C语言中,文件被视为一个字符流或字节流,可以通过标准库函数对其进行读写操作。标准函数库的fopen()和fclose()函数用来打开和关闭文件,这两个函数原型在<stdio.h>头文件内。

打开文件

在C语言中,当我们想要对文件进行读取或写入操作时,必须先打开文件。这是因为操作系统对文件的管理是通过文件描述符来实现的,而文件描述符是在打开文件时由操作系统分配的。只有获得了文件描述符,我们才能对文件进行读写操作。

文件描述符是一个非负整数,它用于在程序中标识一个打开的文件。当打开一个文件时,操作系统会为分配一个文件描述符,并返回给程序。这样,程序就可以通过这个文件描述符来访问和操作文件。

C函数库提供了fopen()函数用于打开文件。

函数声明

FILE * fopen ( const char * filename, const char * mode );

函数以mode模式打开filename指定的文件,若文件打开成功返回文件指针,否则返回NULL值。

filename指定了要打开的文件名称,filename的数据类型为字符串,fileName也包含了文件的存储路径,存储路径可以是相对路径,也可以是绝对路径。

mode指定了文件的打开模式,也就是设定文件的打开权限。比较常用的有’r’、’r+’和’w+’模式,使用’r’模式打开的文件只能读取文件,而不能改写文件内容;使用’r+’模式打开的文件即可以读取文件,也可以写入文件;使用’w+’模式与’r+’模式基本相同,唯一不同的是,使用’w+’模式可以创建一个新的文件,如果打开的文件已存在,原有内容会被删除,因此要谨慎使用’w+’模式打开文件,防止已有文件内容被清空。

文件打开方式 意义
rt 只读打开一个文本文件,只允许读数据
wt 只写打开或建立一个文本文件,只允许写数据
at 追加打开一个文本文件,并在文件末尾写数据
rb 只读打开一个二进制文件,只允许读数据
wb 只写打开或建立一个二进制文件,只允许写数据
ab 追加打开一个二进制文件,并在文件末尾写数据
rt+ 读写打开一个文本文件,允许读和写
at+ 读写打开一个文本文件,允许读,或在文件末追加数据
rb+ 读写打开一个二进制文件,允许读和写
wb+ 读写打开或建立一个二进制文件,允许读和写
ab+ 读写打开一个二进制文件,允许读,或在文件末追加数据

关闭文件

当打开的文件不再使用时,需要及时关闭文件。打开的文件会占用系统资源,如果不关闭已打开的文件,这些资源会被长时间占用,导致系统资源泄露;当向一个打开的文件写入数据时,数据可能首先被写入到一个缓冲区,而不是直接写入到文件,关闭文件可以确保缓冲区中的所有数据都被正确地写入到文件。

C函数库提供了fclose()函数用于关闭文件。

函数声明

int fclose ( FILE * stream );

关闭stream指向的文件,若文件缓冲区有待写入的内容,则被写入文件,若缓冲区内有待读取的内容,则被丢弃。stream由fopen()函数返回。

文件操作案例

下面代码段展示了如何在C语言中打开一个文件,并写入一些数据,然后关闭该文件。

#include <stdio.h>
int main() {
    // 打开文件,用于写入
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("打开文件失败");
        return 1;
    }
    // 写入数据
    fprintf(file, "Hello, World!\n");
    // 关闭文件
    if (fclose(file) == EOF) {
        perror("关闭文件失败");
        return 1;
    }
    return 0;
}

在上面的示例中,使用fopen函数以写入模式("w")打开一个名为example.txt的文件,如果文件打开失败,fopen将返回NULL。然后使用fprintf函数将字符串"Hello, World!\n"写入文件,最后使用fclose函数关闭文件。如果关闭文件失败,fclose将返回EOF。

注意:程序与example.txt在同一目录下。

目录与文件

我们在电脑上管理自己的文件会用到目录的概念,打开电脑就会看到在电脑的磁盘中有很多的目录,目录下面有文件和子目录。这些目录实际上是帮我们对文件进行分类管理。我们可以把一些与工作相关的文件放到工作目录里,把一些与私人相关的文件放到私人目录中,当然还有其它更多的文件分类管理方式。

在电脑中可以创建新的目录,也可以修改原有目录的名称或删除目录,不过删除目录时需要谨慎,防止误删除重要的文件。这些目录的操作都是通过程序来完成的,最常见的程序就是电脑中的资源管理器。

在电脑中创建一个新的目录,需要指定目录路径,目录路径是指从磁盘盘符到新目录所在位置的路径。例如,如果要在D盘盘符下创建一个名称为“document”的目录,则目录路径为“d:\ document”,其中字母“d”是目录所在的盘符号,“document”是目录名称,“\”为分隔各级目录的符号,需要注意的是分隔符号在Windows操作系统下是“\”,在Linux操作系统下是“/”。

文件路径是指从盘符开始到文件所在存储位置的路径,包括目录路径和文件名称。

在C语言中,文件路径通常以字符串的形式表示。例如:

char *path = "/home/user/documents/file.txt";  // 绝对路径
char *relative_path = "documents/file.txt";    // 相对路径

文件路径可以是绝对路径,也可以是相对路径。绝对路径从文件系统的根目录开始,而相对路径则是从当前程序所在目录开始。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论