一切数据皆文件,大部分设备也是文件
一切数据处理程序运行都是在内存中完成
- 文件的概念
- 文件用来存放程序、文档、音频、视频数据、图片等数据的
- 文件就是存放在磁盘上的,一些数据的集合。
- 文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要对文件操作的时候的一些缓冲特点即可
- 行缓冲
- 标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的
- 所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区
- 全缓冲
- 标准io库函数,往普通文件读写数据的,是全缓冲的
- 碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区
- 刷新缓冲区的情况
- 缓冲区满了,刷新缓冲区
- 人为刷新缓冲区 fflush(文件指针)
- 程序正常结束 会刷新缓冲区
- 无缓冲
- 在读写文件的时候通过系统调用io (read write),对文件进行读写数据
- 这个时候是无缓冲的,即写数据会立马进入文件 ,读数据会立马进入内存
- 写文件的流程
- 应用程序空间->内核空间->驱动程序 ->硬盘上
- 应用程序和内核程序运行在不同的空间里,目的是为了保护内核
- 设置缓冲区的目的
- 通过缓冲可以减少进出内核的次数,以提高效率
- 行缓冲
- 磁盘文件的分类
- 一个文件通常是磁盘上一段命名的存储区
- 计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的,以字节为单位进行顺序存储
- 从用户或者操作系统使用的角度(逻辑上)
- 把文件分为
- 文本文件
- 基于字符编码,常见的编码有 ASCII,UNICODE等
- 一般可以使用文本编辑器直接打开
- 歌词文件(lrc):二进制文件
- 二进制文件
- 基于值编码,自己根据具体应用,指定某个值是什么意思
- 把内存中的数据按其在内存中的存储形式原样输出到磁盘上
- 一般需要自己判断或使用特定软件分析数据格式
- 音频文件(mp3):二进制文件
- 图片文件(bmp)文件,一个像素点由两个字节来描述** * ** #####&&&&&
- *代表红色的值
- #代表绿色的值
- &代表蓝色的值
- 二进制文件以位来表示一个意思
- 文本文件、二进制文件对比
- 译码
- 文本文件编码基于字符定长,译码容易些;
- 二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式)
- 空间利用率
- 二进制文件用一个比特来代表一个意思(位操作)
- 而文本文件任何一个意思至少一个字符
- 译码
- 文本文件
- 把文件分为
- 一个文件通常是磁盘上一段命名的存储区
- 文件指针
- 文件指针在程序中用来标示(代表)一个文件的,在打开文件的时候得到文件指针,文件指针就用来代表咱们打开的文件
- 咱们对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即咱们将文件指针,传给读、写、关闭等函数,那些函数就知道要对哪个文件进行操作
- 定义文件指针的一般形式为
- 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 函数时信息打印再此终端
- c语言中有三个特殊的文件指针无需定义,再程序中可以直接使用
- FILE *指针变量标识符
- 打开文件 fopen
- 函数的定义:
- FILE*fopen(const char *path,const char *mode);
- 函数说明
- fopen函数的功能是打开一个已经存在的文件,并返回这个文件的文件指针(文件的标示)或者创建一个文件,并打开此文件,然后返回文件的标示
- 函数的参数
- 参数1 :打开的文件的路径
-
- 绝对路径,从根目录开始的路径名称
- “/home/edu/test/test.txt”
- 相对路径
- "./test/test.txt"
- "../test/test.txt"
- 绝对路径,从根目录开始的路径名称
-
- 参数2:文件打开的方式,即以什么样的方式(只读、只写、可读可写等等)打开文件
- 参数1 :打开的文件的路径
- 函数的定义:
- 关闭文件 fclose
- 函数的头文件:
- #include <stdio.h>
- 函数的定义:
- int fclose(FILE*fp);
- 函数的说明:
- 关闭fp所代表的文件
- 注意一个文件只能关闭一次,不能多次关闭,关闭文件之后就不能再文件指针对文件进行读写等操作了
- 返回值:
- 成功返回0
- 失败返回非0
- 可以通过返回值,来判断关闭文件是否成功
- 函数的头文件:
- 一次读写一个字符
- 函数定义
- 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
- 函数定义
- 一个读写一个字符串
- char *fgets(char *s,int size ,FILE *stream);
- 从stream所指的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了size-1个字节停止读取,在读取的内容后面会价一个\0,作为字符串的结尾
- 返回值:成功返回目的数组的首地址,即s
- 失败返回NULL
- int fputs(const char *s,FILE * stream);
- 函数功能:
- 将s指向的字符串,写到stream所代表的文件中
- 返回值
- 成功返回写入的字节数
- 失败返回-1
- 函数功能:
- char *fgets(char *s,int size ,FILE *stream);
- 读文件 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
- 函数的定义:
- 写文件fwrite
- 函数的定义:
- size_t fwrite(void * ptr, size_t size, size_t nmemb ,FILE * stream);
- 函数的说明:
- fwrite 函数将ptr指向的内存里的数据,向stream所标示的文件写入
- 返回值:
- 调用成功,返回值为输入输出的基本单元数,如果执行失败,返回值为0
- 注意:
- fwrite 函数是将内存中的数据原样输出到文件中
- fread 函数是将文件中的数据原样读取到内存中
- 函数的定义:
- 格式化读写文件函数
- 函数调用
- fprintf(文件指针,格式字符串,输出表列);
- fscanf(文件指针,格式字符串,输入表列);
- 函数功能:
- 从磁盘文件中读入或输出字符
- fprintf和printf函数类似:
- printf 是将数据输出到屏幕上(标准输出),而fprintf函数是将数据输出到文件中
- fscanf和scanf函数类似
- scanf是从键盘(标准输入)获取输入,而fscanf是从文件指针所标示的文件获取输入
- 函数调用
- 随机读写
- 可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。
- 完成文件定位的函数有
- 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
- 位移量
- 以起始点为基点,向前、后移动得字节数。可以为负。正数往文件末尾方向偏移,负数往文件首尾偏移
- whence 起始位置
- 返回值
- 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码
- rewind函数 复位读写位置
- 文件加密/解密
- 对称加密体制是传统而经典的加密体制策略。所谓对称加密体制即加密方A和解密方B共享一个密匙key。加密方A使用该密钥key对要保密的文件进行加密操作,从而生成密文;解密方B同样使用该密匙key对加密方生成的加密文件实施解密操作,从而生成明文
原文地址:https://www.cnblogs.com/fengzi759/p/11618722.html
时间: 2024-11-06 21:34:38