• 【C语言】文件操作(一)


    在这里插入图片描述

    前言
    本篇博客讲解对文件的操作,包括打开,关闭操作。在下篇博客将讲解文件的读写。


    一、 什么是文件?

    1.1 用于存储数据

    文件是计算机系统中用于存储数据的基本单位。它可以包含文本、图像、音频、视频等各种类型的信息。文件通常以某种特定的格式存储,这个格式决定了文件中数据的组织方式,以及如何解释和处理这些数据。


    1.2 文件类型

    在计算机编程和脚本语言中,通常会使用多种类型的文件。以下是一些常见的文件类型:

    • 源代码文件: 这些文件包含程序员编写的源代码,通常使用特定的编程语言编写。这些文件以不同的文件扩展名结尾,例如:
      C/C++源文件:.c /.cpp
      Java源文件:.java
      Python源文件:.py
    • 头文件: 在某些编程语言中,头文件包含了程序中使用的函数、变量和数据结构的声明。它们通常以特定的文件扩展名结尾,如:
      C/C++头文件:.h
    • 文本文件: 文本文件包含人类可读的文本信息,例如文档、日志文件、报告等。它们可以使用各种文本编辑器进行编辑和查看。
    • 二进制文件: 二进制文件包含非文本数据,例如图像、音频、视频、可执行文件等。这些文件不是人类可读的,而是由计算机程序进行解释和处理。

    还有许多种文件类型,这里不再一一列举。


    1.3 文件名

    一个文件要有一个唯一的文件标识,以便用户识别和引用。

    ⽂件名包含3部分:⽂件路径+⽂件名主干+⽂件后缀
    例如:c:\code\test.txt

    为方便起见,文件标识常被称为文件名。

    1.4 二进制文件和文本文件

    数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制文件
    如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是文本文件
    在这里插入图片描述


    二、文件的打开和关闭

    2.1 流和标准流

    在计算机编程和操作系统中,“流”(stream)是一种用于在程序之间传输数据的抽象概念。 流可以用于输入(读取数据)和输出(写入数据),它们通常表示为一个序列化的数据流,可以是字节、字符或其他数据单元的连续流。

    有两种主要类型的流:输入流和输出流。此外,有一种特殊类型的流称为标准流,它用于在程序和操作系统之间进行标准输入和标准输出。

    1. 输入流: 用于从外部源(如文件、键盘、网络连接)读取数据到程序中,使程序能够处理这些数据。输入流通常是单向的,只允许从源读取数据。常见的输入流操作包括从文件中读取数据、从键盘读取用户输入。
    2. 输出流: 用于将程序中的数据写入到外部目标(如文件、屏幕、网络连接)中,以供其他程序或用户查看或使用。输出流通常也是单向 的,只允许向目标写入数据。常见的输出流操作包括将数据写入文件、在屏幕上显示信息。
    3. 标准流: 用于与操作系统进行交互。它包括三个标准流(在C语言中标准流i是默认打开的不需要显式打开或关闭它们):
      • stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
      • stdout - 标准输出流,⼤多数的环境中输出至显示器界⾯。
      • stderr - 标准错误流,标准错误流通常用于显示程序执行期间的错误消息,而不是正常的输出。

    实际上 stdin stdout stderr 都是在C标准库中定义的全局变量,具有与 FILE* 类型相同的类型。这使得它们可以作为参数传递给标准库函数。在下一篇【C语言】文件操作(二)中讲到


    2.2 文件指针

    文件操作通常涉及到内存中的一个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类型数据的指针变量。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这些成员的确切定义和实现可能因操作系统和编译器的不同而有所不同。每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关心细节。在这里插入图片描述


    2.3文件的打开与关闭

    在读写文件时,需要先打开文件,然后进行读写,最后需要关闭文件
    在打开和关闭文件时,需要用到两个函数fopenfclose

    //打开⽂件
    FILE * fopen ( const char * filename, const char * mode );//filename是文件名,mode表示文件打开的模式
    
    //关闭⽂件
    int fclose ( FILE * stream );//stream是一个文件指针
    
    • 1
    • 2
    • 3
    • 4
    • 5

    文件打开模式, 如下:

    文件使用方式含义如果指定文件不存在
    “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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
    欢迎大家提出疑问,以及不同的见解。

  • 相关阅读:
    mac配置双网卡 mac同时使用内网和外网
    计算属性 vs methods
    Httpd启动报错 Couldn‘t create the ssl-cache 的解决办法
    西宁市初中生地会考报名照片尺寸要求及手机自拍方法
    【面经】华为车BU面经
    【Vue基础-数字大屏】地图
    芯片学习记录AM26LS31INSR
    有哪些适合程序员做的副业?
    XML简单介绍
    CentOS安装mysql8
  • 原文地址:https://blog.csdn.net/weixin_73551991/article/details/133324946