1-文件是计算机表示信息的最小逻辑单位,文件是一个外存的概念,但凡提到文件,就一定与外存有关,文件内的数据可以调到内存,就只能用 数据 描述
2-文件的组成:文件名 + 文件内容
在window操作系统中,可以双击某个文件,看到文件的内容,但实际上看到的并不是真实内容,而是真实的文件内容(二进制数据)通过特定软件进行解析的结果,文件编程是对真实的文件内容进行读,写操作
3-OS所提供的一套文件操作机制:电视机机制
文件是一个外存的概念,想对其内容进行操作,需要将文件内容调到内存中才可以进行,文件需要先调入内存,才可以通过程序对其控制
4-文件的大小是任意的,而可用的内存是有限的,用电视机机制方可进行想要的操作,电视机的尺寸是有限的,但可以通过屏幕看到全球(任意)的画面
5-FCB,即文件控制块,其本质上是一个结构体,它的成员用来进行对文件的各种操作,不同的操作系统FCB各有区别,但本质上是一样的,在C中FCB的名称是:FILE类型(在stdio.h中定义)
6-关于OS和FCB,FCB本身是OS内部有限,珍贵的资源,由于FCB是有限的,因此,对于FCB的操作,存在 申请,释放等过程,而且必须及时释放,以免OS资源不足
7-文件操作的基本步骤和相应的系统函数:
FILE *fopen(const char *文件路径, const char *操作方式);
void fclose(FILE *fp);
这个就是打开和关闭文件的操作,其本质是向OS申请FCB资源,所以返回的是FILE *而不是FILE,即,让程序中的指针能够指向OS分配给程序的FCB
提供某个FCB的首地址,由OS回收这个FCB,以便能够再次使用
8-文件的基本操作步骤
申请FCB(打开文件),调用fopen()函数完成
针对文件的各种访问
归还FCB(关闭文件),调用fclose()函数完成
9-关于fopen():其两个参数 char *pathfile和char mode,filepath指明要操作的文件名称和路径,mode指要操作的基本方式
mode有两部分,
操作方式:r(只读),w(创建),a(追加),除此外还有 r+,既读也写
文件类型说明:t(文本文件),b(二进制文件)
若以r方式打开某文件,而这个文件并不存在,则fopen()函数返回NULL,表明申请FCB失败
若以w方式打开文件,若这个文件并不存在,则先创建一个空文件,若这个文件存在,则先清空其中的内容,仍是一个空文件
10-打开,关闭文件只是文件编程的第一步和最后一步,中间应该用文件读写函数完成对文件的操作
文件写函数:将字符串写到fp所指文件中
fprintf(FILE *fp, const char *format,…)
文件读函数:从文件中按照format(格式符)读取数据
注意:C语言提供两个量,stdin和stdio分别表示标准输入设备(键盘)和标准输出设备(屏幕),fprintf()函数和fscanf()函数的功能和过程与printf()和scanf()
完全一致,仅差别在于,printf()和scanf()只能从键盘和屏幕进行IO,而fprintf()和fscanf()不仅可以从键盘和屏幕进行IO,还可以从FILE *所指定的文件进行IO,文件和设备的管理,对于OS而言,在高层是完全相同的
11- int fgetc(FILE *p); 从fp所控制的文件中读取一个字节的数据,并将读写指针移动到后一个字节
int fputc(int ch, FILE *fp);向fp所控制的文件中写入一个字节的数据,并将读写指针向后移动一个字节
12- feof(FILE *fp); feof()函数的意思是,最开始的f字母表示这是一个文件操作函数(像 fopen,fclose,fprintf…),eof的意思是 endding of file

13- char *fgets() (char *str, int n, FILE *stream);
从stream(文件)中读取最多n个字节的字符,复制到str所指向的空间,并加上0结束标志
实质上,fgets()是读取 一行 信息,以 回车 为结束,意思是:若文件中,从文件读写指针开始的那一行包含的字符数多于n个那么只读n个字符,若那一行字符数少于n个,则读到回车就结束
对于fgets()函数的特点,如果一个文件是纯文本文件,且每一行的字符数少于某个数,那么可以用 fgets(str,80,fp)逐个读取这个文件的内容形成字符串
int fputs(char *str,FILE *fp);
将str所指字符串,与0结束标志写入到fp所控制的文件中
这两个函数,专门针对文本(字符串)文件的读写
14-缓冲区:buffer
实际上就是一段内存空间,用来接收,准备相关数据,以便进行后续操作
unsigned int fwrite(const void *buffer,unsigned int size,
unsigned int count,FILE stream);
将buffer所指空间开始的sizecount个字节的内容,写到stream所控制的文件
fread()是将文件stream中读出size个字节长度,count是读取对象个数,通常为1,写到buffer中
15- fprintf(fp,"%d", num)
num = 100
写到fp所控制的文件的内容是字符串 “100” 31 30 30
fwrite(&num,sizeof(int),1,fp)
写到fp所控制的文件的内容是100这个int在内存中补码值是 64 00 00 00
16- 打开文件的函数 fopen(),第二个参数mode,决定了操作方式和文件类型(文本或二进制)但是实际程序发现,fopen()函数指定的文件类型,不能真正决定文件的类型
真正决定文件类型的是,所使用的写文件的函数
用fprintf(),fputs()写到文件中的始终都是ASCII码(文本),因此用他们写数据,则相关文件只能是文本文件
用fputs(),fwrite()写文件中的数据,有可能是非ASCII码,因此用他们写数据,相关文件只能是二进制文件
17- fseek(FILE *stream, long offset, int fromwhere)
fseek()的功能就是将文件读写指针移动到offset所执行的那个字节处,
fromwhere 有三种取值, 在stdio.h中有三个宏和它对应
SEEK_SET 从文件头开始定位
SEEK_CUR 从文件读写指针当前所在位置开始定位
SEEK_END 从文件末尾(最后一个字节处)定位
18- ftell(): 函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置
使用 ftell(FILE *file)

被折叠的 条评论
为什么被折叠?



