标签:定义 文件编码 mem 刷新 fgetc short text 开始 error
一切数据处理程序运行都是在内存中完成
文件的概念
文件用来存放程序、文档、音频、视频数据、图片等数据的
文件就是存放在磁盘上的,一些数据的集合。
文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要对文件操作的时候的一些缓冲特点即可
行缓冲
标准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 函数时信息打印再此终端
打开文件 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 <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
读文件 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对加密方生成的加密文件实施解密操作,从而生成明文
标签:定义 文件编码 mem 刷新 fgetc short text 开始 error
原文地址:https://www.cnblogs.com/fengzi759/p/11618722.html