文件
文件的概念和分类
概念
文件用来存放程序、文档、音频、视频数据、图片等数据的。文件就是存放在磁盘上的,一些数据的集合。在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序,对文件进行打开、显示、读写、关闭。作为一个程序员,必须掌握编程实现创建、写入、读取文件等操作
对文件的操作是经常要用到的知识,比如:写飞秋软件传送文件等
分类
磁盘文件:(我们通常认识的文件)
指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。
设备文件:
在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。
键盘:标准输入文件
屏幕:标准输出文件
其它设备:打印机、触摸屏、摄像头、音箱等
在Linux操作系统中,每一个外部设备都在/dev目录下对应着一个设备文件,咱们在程序中要想操作设备,就必须对与其对应的/dev下的设备文件进行操作。
标准IO库函数对磁盘文件的读取特点

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

磁盘文件的分类
分类



文本文件和二进制文件的区别

1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
PS

文件指针
概念
文件指针不是指向一个文件,文件指针是个指针,是个结构体指针,用文件体指针标识文件
文件指针在程序中用来标识(代表)一个文件的,在打开文件的时候得到文件指钱,文件指针就用来代表咱们打开的文件
对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即咱们将文件指针,传给读写、关闭等函数,那些函数就知道要对哪个文件进行操作
定义
头文件<stdio.h>
一般形式 FILE * 指针变量标识符 (FILE要大写)
FILE不是函数,是系统使用typedef定义的一种结构体类型,包含了文件名,文件状态,文件当前的位置等信息
一般情况下,我们操作文件前必须定义一个文件指针标识我们将要操作的文件
实际编程中使用库函数操作文件,无需关心FILE结构体的细节﹐只需要将文件指针传给io库函数,库函数再通过FILE结构体里的信息对文件进行操作


操作文件步骤
1、对文件进行读写等操作之前要打开文件得到文件指针
2、可以通过文件指针对文件进行读写等操作
3、读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了
打开文件
FILE *fopen(const char* path,const char* mode);
打开一个存在的文件,并返回其文件指针(文件标识),或创建一个文件,然后打开它,并返回标识
参数一 表示路径,有绝对路径和相对路径之分
绝对路径指从根目录,比如C盘,D盘开始的路径,由于\是特殊字符,所以传绝对路径时需要用\\来表示\
相对路径是指,从当前文件夹下开始的路径,比如 .\\test\\aaa.txt 开头的点表示从此目录开始
参数二 表示文件打开的操作,比如只读,只写,可读可写等
r是只读方式打开文件,文件不存在返回NULL,存在则返回文件指针
w是只写方式打开文件,文件不存在就(如果可以创建)创建并打开,如果存在,清空文件内容,然后进行写的操作 如果文件打不开,比如只读的文件,就返回NULL
a是以追加方式打开文件,若文件不存在,则同w,若存在,则在文件末尾处进行写的操作,如果不加a的话,打开文件的时候读写位置在文件的开始,对文件进行读写的时候都是从文件开始进行
在后边带上+就是可读可写的打开文件,b是以二进制文件打开,t是以文本方式打开
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,注意所用系统的规定
关闭文件
fclose(文件指针)
只能关一次,关了之后就不能再进行读写等操作了
关闭成功返回0,失败返回非0
读写文件
读一个字符
fgetc(文件指针)
从文件指针标识的文件中读取一个字节,并返回字节值
返回值,以t的方式:读到文件结尾返回EOF(-1)
以b的方式,读到文件结尾,以feof(文件指针)判断结尾
feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0(即,文件结束:返回非0值;文件未结束:返回0值)
写一个字符
fputc(int c,文件指针)
将c的值写到文件指针标识的文件中
写成功则返回c的字节值,否则返回EOF(-1)
PS(字符)
打开文件的时候,默认读写位置在文件的开始,如果以a的方式打开读写位置在文件的末尾
向文件中读取字节或写入字节的时候,读写位置会往文件的末尾方向偏移,读写多少个字节,读写位置就往文件的末尾方向偏移多少个字节
读一个字符串
char*fgets(char *s, int size, FILE*stream);
从stream所代表的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了size-1个字节停止读取,在读取的内容后面会加一个\0,作为字符串的结尾
成功则返回目的数组的首地址
失败返回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块,也就是一共读size乘以nmemb个字节,并存放到ptr指向的内存里
返回值:实际读到的块数
按块写
fwrite
size_t fwrite(void*ptr, size_t size, size_t nmemb, FILE*stream);
fwrite函数将ptr指向的内存里的数据,向 stream所标识的文件中写入数据,一块是size个字节,共nmemb块
返回值:实际写入的块数
PS(块)
fwrite函数是将内存中的数据原样输出到文件中
firead函数是将文件中的数据原样读取到内存里
随机读写
概念
前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第200--300个字节
为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称随机读写
前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第200--300个字节
为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称读写
实现随机读写的关键是 要按要求移动位置指针,这称为文件的定位
完成文件定位的函数有:rewind、fseek函数
rewind
void rewind(文件指针)
把文件内部的位置指针移到文件的开始
ftell
long ftell(文件指针)
取得文件流目前的读写位置,距离文件开始有多少个字节
返回当前读写位置,距离文件首的字节数,出错时返回-1
fseek
一般用于二进制文件,即打开文件方式要带b
int fseek(FILE*stream,long offset, int whence);
移动文件流的读写位置

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

浙公网安备 33010602011771号