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