C语言文件
Posted fengzi759
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言文件相关的知识,希望对你有一定的参考价值。
一切数据处理程序运行都是在内存中完成
-
文件的概念
-
文件用来存放程序、文档、音频、视频数据、图片等数据的
-
文件就是存放在磁盘上的,一些数据的集合。
-
-
文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要对文件操作的时候的一些缓冲特点即可
-
行缓冲
-
标准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对加密方生成的加密文件实施解密操作,从而生成明文
-
以上是关于C语言文件的主要内容,如果未能解决你的问题,请参考以下文章