C语言文件

Posted fengzi759

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言文件相关的知识,希望对你有一定的参考价值。

一切数据皆文件,大部分设备也是文件

一切数据处理程序运行都是在内存中完成

  1. 文件的概念

    • 文件用来存放程序、文档、音频、视频数据、图片等数据的

    • 文件就是存放在磁盘上的,一些数据的集合。

  2. 文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要对文件操作的时候的一些缓冲特点即可

    • 行缓冲

      • 标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的

      • 所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区

    • 全缓冲

      • 标准io库函数,往普通文件读写数据的,是全缓冲的

      • 碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区

      • 刷新缓冲区的情况

        • 缓冲区满了,刷新缓冲区

        • 人为刷新缓冲区 fflush(文件指针)

        • 程序正常结束 会刷新缓冲区

    • 无缓冲

      • 在读写文件的时候通过系统调用io (read write),对文件进行读写数据

      • 这个时候是无缓冲的,即写数据会立马进入文件 ,读数据会立马进入内存

    • 写文件的流程

      • 应用程序空间->内核空间->驱动程序 ->硬盘上

      • 应用程序和内核程序运行在不同的空间里,目的是为了保护内核

    • 设置缓冲区的目的

      • 通过缓冲可以减少进出内核的次数,以提高效率

  3. 磁盘文件的分类

    • 一个文件通常是磁盘上一段命名的存储区

      • 计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的,以字节为单位进行顺序存储

      • 从用户或者操作系统使用的角度(逻辑上)

        • 把文件分为

          • 文本文件

            • 基于字符编码,常见的编码有 ASCII,UNICODE等

            • 一般可以使用文本编辑器直接打开

            • 歌词文件(lrc):二进制文件

          • 二进制文件

            • 基于值编码,自己根据具体应用,指定某个值是什么意思

            • 把内存中的数据按其在内存中的存储形式原样输出到磁盘上

            • 一般需要自己判断或使用特定软件分析数据格式

            • 音频文件(mp3):二进制文件

            • 图片文件(bmp)文件,一个像素点由两个字节来描述** * ** #####&&&&&

              • *代表红色的值

              • #代表绿色的值

              • &代表蓝色的值

              • 二进制文件以位来表示一个意思

          • 文本文件、二进制文件对比

            • 译码

              • 文本文件编码基于字符定长,译码容易些;

              • 二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式)

            • 空间利用率

              • 二进制文件用一个比特来代表一个意思(位操作)

              • 而文本文件任何一个意思至少一个字符

  4. 文件指针

    • 文件指针在程序中用来标示(代表)一个文件的,在打开文件的时候得到文件指针,文件指针就用来代表咱们打开的文件

    • 咱们对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即咱们将文件指针,传给读、写、关闭等函数,那些函数就知道要对哪个文件进行操作

    • 定义文件指针的一般形式为

      • FILE *指针变量标识符

        • FILE 为大写 需要包含<stdio.h>

        • FILE 是系统使用typedef 定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件当前位置等信息

        • 一般情况下,我们操作文件前必须定义一个文件指针标示我们将要操作的文件

        • 实际编程中使用库函数操作文件,无需关心FILE结构体的细节,只需要将文件指针传给io库函数,再通过FILE结构体里的信息对文件进行操作

        • FILE 再stdio.h文件中的文件类型声明

          • typedef struct

          • short level; //缓冲区"满"或“空”的程度

          • unsigned flags;// 文件状态标志

          • char fd; //文件描述符

          • unsigned charhold; //如无缓冲区不读取字符

          • short bsize; //缓冲区的大小

          • unsigned char*buffer;//数据缓冲区的位置

          • unsigned ar*curp;//指针,当前的置信

          • unsigned istemp; //临时文件,指示器

          • shorttoken; //用于有效性检查

          • FILE

          • 再缓冲文件系统中,每个被使用的文件都要再内存中开辟一块FILE类型的区域 ,存放与操作文件相关的信息。

      • 对文件操作的步骤:

        • 对文件进行读写等操作之前要打开文件得到文件指针

        • 可以通过文件指针对文件进行读写等操作

        • 读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了

      • 补充

        • c语言中有三个特殊的文件指针无需定义,再程序中可以直接使用

          • stdin:标准输入 默认为当前终端(键盘)

          • stdout:标准输出 ,默认为当前终端(屏幕)

            • 我们使用的 printf、puts 函数默认输出信息到此终端

          • stderr: 标准错误输出设备文件 默认为当前终端(屏幕)

            • 当我们程序出错使用:perror 函数时信息打印再此终端

  5. 打开文件 fopen

    • 函数的定义:

      • FILE*fopen(const char *path,const char *mode);

    • 函数说明

      • fopen函数的功能是打开一个已经存在的文件,并返回这个文件的文件指针(文件的标示)或者创建一个文件,并打开此文件,然后返回文件的标示

    • 函数的参数

      • 参数1 :打开的文件的路径

          1. 绝对路径,从根目录开始的路径名称

            • “/home/edu/test/test.txt”

          2. 相对路径

            • "./test/test.txt"

            • "../test/test.txt"

      • 参数2:文件打开的方式,即以什么样的方式(只读、只写、可读可写等等)打开文件

  6. 关闭文件 fclose

    • 函数的头文件:

      • #include <stdio.h>

    • 函数的定义:

      • int fclose(FILE*fp);

    • 函数的说明:

      • 关闭fp所代表的文件

    • 注意一个文件只能关闭一次,不能多次关闭,关闭文件之后就不能再文件指针对文件进行读写等操作了

    • 返回值:

      • 成功返回0

      • 失败返回非0

    • 可以通过返回值,来判断关闭文件是否成功

  7. 一次读写一个字符

    • 函数定义

      • int fgetc(FILE * stream)

    • 函数说明:

      • fgetc从stream所标示的文件中读取一个字节,将字节值返回

    • 返回值:

      • 以t的方式:读到文件结尾返回EOF

      • 以b的方式: 读到文件结尾,使用feof判断结尾

      • feof(检查文件流是否读到了文件尾)

        • int feof (FILE * stream)

        • 函数说明: feof() 用来侦测是否读取到了文件尾,尾数stream 为fopen()返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0

        • 返回值 返回非零值代表已到达文件尾

    • 函数定义:

      • int fputc(int c,FILE * stream)

    • 函数的说明

      • fputc将c的值写到stream所代表的文件中

    • 返回值

      • 如果输出成功,则返回输出的字节值

      • 如果输出失败,则返回一个EOF

  8. 一个读写一个字符串

    • char *fgets(char *s,int size ,FILE *stream);

      • 从stream所指的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了size-1个字节停止读取,在读取的内容后面会价一个\0,作为字符串的结尾

      • 返回值:成功返回目的数组的首地址,即s

        • 失败返回NULL

    • int fputs(const char *s,FILE * stream);

      • 函数功能:

        • 将s指向的字符串,写到stream所代表的文件中

      • 返回值

        • 成功返回写入的字节数

        • 失败返回-1

  9. 读文件 fread

    • 函数的定义:

      • size_t fread (void * ptr, size_t size , size_t nmemb,FILE * stream);

    • 函数的说明:

      • fread函数从stream 所标示的文件中读取数据,一块是size个字节,共nmemb块,存放到ptr指向的内存

    • 返回值:

      • 实际读到的块数

    • 举例

      • int num;

      • num = fread(str,100,3,fp);

      • 从fp所代表的文件中读取内容存放到str指向的内存中,读取的字节数为,每块100个字节,共3块,返回值num

      • 如果读到300个字节返回值num为3

      • 如果读到了大于等于200个字节小于300个字节,返回值为2

      • 读到的字节数,大于等于100个字节小于200个字节,返回1

      • 不到100个字节返回0

  10. 写文件fwrite

    • 函数的定义:

      • size_t fwrite(void * ptr, size_t size, size_t nmemb ,FILE * stream);

    • 函数的说明:

      • fwrite 函数将ptr指向的内存里的数据,向stream所标示的文件写入

    • 返回值:

      • 调用成功,返回值为输入输出的基本单元数,如果执行失败,返回值为0

    • 注意:

      • fwrite 函数是将内存中的数据原样输出到文件中

      • fread 函数是将文件中的数据原样读取到内存中

  11. 格式化读写文件函数

    • 函数调用

      • fprintf(文件指针,格式字符串,输出表列);

      • fscanf(文件指针,格式字符串,输入表列);

    • 函数功能:

      • 从磁盘文件中读入或输出字符

    • fprintf和printf函数类似:

      • printf 是将数据输出到屏幕上(标准输出),而fprintf函数是将数据输出到文件中

    • fscanf和scanf函数类似

      • scanf是从键盘(标准输入)获取输入,而fscanf是从文件指针所标示的文件获取输入

  12. 随机读写

    • 可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。

    • 完成文件定位的函数有

      • rewind函数 复位读写位置

        • void rewind(文件指针);

        • 函数功能:

          • 把文件内部的位置指针移到文件首

        • 调用形式:

          • text文件指针);

      • ftell 测文件读写位置距文件开始有多少个文件

        • 定义函数:

          • long ftell(文件指针);

        • 函数功能

          • 取得文件流目前得读写位置

        • 返回值:

          • 返回当前读写位置(距离文件起始得字节数)

      • fseek函数 定位位置指针(读写位置)

        • fseek函数(一般用于二进制文件即打开文件得方式需要带b)

        • 定义函数

          • int fseek(FILE * stream,long offset,int whence);

          • // int fseek(文件类型指针,位移量,起始点)

        • 函数功能:

          • 移动文件的读写位置

        • 参数:

          • whence 起始位置

            • 文件开头 SEEK_SET 0

            • 文件当前位置 SEEK_CUR 1

            • 文件末尾 SEEK_END 2

          • 位移量

            • 以起始点为基点,向前、后移动得字节数。可以为负。正数往文件末尾方向偏移,负数往文件首尾偏移

        • 返回值

          • 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码

  13. 文件加密/解密

    • 对称加密体制是传统而经典的加密体制策略。所谓对称加密体制即加密方A和解密方B共享一个密匙key。加密方A使用该密钥key对要保密的文件进行加密操作,从而生成密文;解密方B同样使用该密匙key对加密方生成的加密文件实施解密操作,从而生成明文

以上是关于C语言文件的主要内容,如果未能解决你的问题,请参考以下文章

在C语言里标准函数存放在啥文件中?

C语言文件操作问题

C语言函数编写:文件复制

c语言调用libzip库读zip文件

C语言关于文件的操作

c语言写入文件方法