文章目录
- 第十章:文件
- 10.1-文件概述
- 文件
- 流与缓冲
- 缓冲区
- 10.2-文件类型指针
- 10.3-文件的打开与关闭
- 文件打开函数fopen()
- 文件关闭函数fclose()
- 10.4-文件的顺序读写
- 单个字符读写函数
- `fgetc()、fputc()`
- 数据块读写函数(二进制方式)
- `fread()`
- `fwrite()`
- 格式化读写函数
- fprintf()
- fscanf()
- 字符串读写函数
- `fgets()`
- `fputs()`
- 其他读写函数
- `putw()`
- `getw()`
- 10.4-文件的随机读写
- `rewind()`
- `fseek()`
- `ftell()`-->取文件指针当前位置
- 10.5-文件读写的出错检测
- 文件读写错误检测函数`ferror()`
- 清楚文件错误标志函数 `clearerr()`
- 文件删除函数 `remove()`
- 10.6-补充函数
- `itos()`
- `stoi()`
第十章:文件
10.1-文件概述
文件
-
定义:指存储在外部介质(如此盘磁带)上数据的集合,是操作系统数据管理的单位(文件名)
-
程序文件:.c 、.obj 、.exe
-
数据文件:文件内容是供程序运行时读写的数据
-
C语言中的文件
- 为了简化操作,不同硬件设备被看作一个文件。对于这些文件的操作,等同于对磁盘上普通文件的操作。
- 键盘:输入文件,scanf就是从这个文件获取数据
- 显示器:输出文件,printf就是向这个文件输出
-
C语言在
stdio.h
文件中定义了3个标准文件 -
文件的分类:根据数据的组织形式
-
ASCII文件(文本文件):以字符形式存储数据文件
-
二进制文件(映像文件):以二进制形式存储数据的文件称为二进制文件,它是按照数据在内存中的存储形式原样存储数据的
整数10000->'1' '0' '0' '0' '0'->00110001 00110000 00110000 00110000 00110000
-
-
ASCII文件与二进制文件的区别
- ASCII文件:便于字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间
- 二进制文件:可以节省外存空间和转换时间,但一个字符并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存
流与缓冲
-
流:数据在数据源和程序(内存)之间传递的过程叫做流。
-
输入流:数据从数据源复制到程序(内存)的过程叫做输入流
-
输出流:从程序(内存)保存到文件的过程叫做输出流
-
打开文件就是打开了一个流
-
流的格式:文本流和二进制流
-
文本流是一种字符序列,通常是一行行的字符,换行符表示一行的结束。
-
二进制流是一种字节序列,它与外设中的字节序列是一一对应的。
-
-
说明:
- C语言把文件看作是一个有序的字节流(字符流或二进制流)
- C语言中,对数据的存取是以字节为单位
缓冲区
- 在向文件写数据时,是先将数据送到缓冲区,待缓冲区充满后才正式输出到文件。如果当数据未充满缓冲区而程序结束运行,就会出现将缓冲区中的数据丢失,或者损坏文件
- 用fclose()关闭文件,它先将缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量,切断由fopen()所建立起来的文件指针与文件名之间的联系,供其它文件使用,并清除掉缓冲区残留的数据。
10.2-文件类型指针
-
对文件进行读写需要知道:文件名字、文件状态、当前位置、缓冲区等有关信息等
-
系统为每个正在使用的文件开辟一个相应的文件信息区,用来存放文件的有关信息。这些信息保存在有关结构类型的变量中。
-
FILE是定义在头文件stdio.h中的文件结构体
-
在
stdio.h
文件中有以下的文件类型声明:typedef struct { short level; /*缓冲区”满”或”空”的程度*/unsigned flags; /*文件状态标志*/char fd; /*文件描述符*/unsigned char hold; /*如无缓冲区不读取字符*/short bsize; /*缓冲区的大小*/unsigned char *buffer; /*数据缓冲区的位置*/unsigned char *curp; /*指针,当前的指向*/unsigned istemp; /*临时文件,指示器*/short token; /*用于有效性检查*/ }FILE;
-
文件结构类型在打开文件时由系统自动建立,当用户使用文件时不用重复定义
-
在C程序中,如果要对已经打开的文件进行操作,必须通过指向该文件结构的指针,所以需要定义文件类型指针变量。如:FILE *fp;
-
fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件
-
所谓打开文件,指为文件建立相应的信息区(用来存放文件名、文件状态、当前读写位置等相关信息),和文件缓冲区(用来暂存输入输出的数据)
-
关闭文件撤销文件信息区和文件缓冲区,使指针变量不再指向该文件,也就无法进行文件的读写。
10.3-文件的打开与关闭
文件打开函数fopen()
-
调用方式:
fopen(文件名,使用文件方式);FILE*fp; //定义一个指向文件的指针变量fp fp=fopen(″a1″,″r″); //将fopen函数的返回值赋给指针变量fp
-
文件打开方式:
-
函数的功能及返回值
- 功能:按指定的文件使用方式打开指定文件
- 调用成功:返回打开文件的文件结构变量的地址
- 不成功:返回NULL(0),即指定文件无法打开
FILE *fp;fp = fopen( “c:\\data\\test.dat”,“rb”); //按二进制方式进行读操作if(fp==NULL){ printf("文件打开失败");exit(0); /*头文件:stdlib.h*/}
文件关闭函数fclose()
-
关闭文件:使文件的指针变量不再指向该文件
-
fclose()原型:
int fclose(FILE *fp);//*fp是指向被关闭文件的指针变量
-
返回值:
- 调用成功,返回0
- 不成功,返回EOF(-1)
10.4-文件的顺序读写
- 文件顺序读写指按数据先后次序进行读写,每读写一次后,文件指针自动指向下一读写位置。<stdio.h>
单个字符读写函数
fgetc()、fputc()
数据块读写函数(二进制方式)
fread()
-
用
fread()
函数从文件中读入一个数据块,以二进制形式读 -
定义形式:
fread(buffer, size, count, fp);buffer:用来存放从文件读入的数据的存储区的起始地址 size:要读写的字节数 count:要读写多少个数据项(每个数据项长度位size) fp:FILE类型指针 eg: float f[10]; fread(f,4,10,fp);//从fp所指向的文件读入10个4个字节的数据,存储到数组f中
fwrite()
-
用
fwrite()
函数向文件写一个数据块,以二进制形式写 -
定义形式:
fwrite(buffer, size, count, fp);buffer:是把此地址开始的存储区中的数据向文件输出
格式化读写函数
- fprintf和fscanf函数的读写对象不是终端而是文件
fprintf()
-
定义形式:
fprintf(文件指针,格式化字符串,输出表列);fprintf(fp,"%d,%6.2f",i,f);//将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中
fscanf()
-
定义形式:
fscanf(文件指针,格式化字符串,输入地址表列);fscanf(fp,"%d,%f",&i,&f);//磁盘文件上如果有字符"3,4.5",则从中读取整数3送给整形变量i,读取实数4.5送给float型变量f
注意:用fprintf和fscanf函数对磁盘文件读写时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。
字符串读写函数
fgets()
-
定义:
fgets(str,n,fp);
-
功能:从fp指向的文件读入一个长度为(n-1)的字符串,存放在字符数组str中
-
返回值:读成功,返回地址str,失败则返回NULL
fputs()
-
定义:
fputs(str, fp);
-
功能:把str所指向的字符串写到文件指针变量fp所指向的文件中
-
返回值:输出成功,返回0;失败则返回非0值
其他读写函数
putw()
- 原型:
int putw(int i,FILE *fp);
- 功能:将整型量i写入fp指向的文件
- 返回值:返回所写的值
getw()
-
原型
int getw(FILE *fp);
-
功能:从流中取一整数,并适当增大文件的位置指示器(从磁盘读入一个整数到内存)。由于读取数值时可能会有数值等于EOF的数,必须使用feof( )、ferror( )确定是否读到文件结束标志或出现错误。
putw()、getw()并非ANSIC标准定义的函数,多数C编译都提供这两个函数,但函数名不同
10.4-文件的随机读写
-
随机读写:读写完上一个字符(字节)后,并不一定要读写其后续的字符,而可以读些文件中任意位置上所需要的字符。
-
C语言提供了文件定位操作函数实现文件的随机读写。
rewind()
- 原型:
rewind(文件指针);
- 功能:使文件位置标记重新返回文件的开头,此函数无返回值
fseek()
-
原型:
fseek(文件指针类型,位移量,起始点);起始点:用0、1、2代替,"0"代表"文件开始位置;"1"代表"当前位置";"2"代表"文件末尾位置" 位移量:指以起始点为基点,向前移动的字节数(长整型)eg: fseek (fp,100L,0); //将文件位置标记向前移到离文件开头100个字节处 fseek (fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处 fseek (fp,-10L,2); //将文件位置标记从文件末尾处向后退10个字节
-
函数功能:改变文件标记位置,一般用于二进制文件
ftell()
–>取文件指针当前位置
-
原型:
long ftell(FILE *fp);
-
功能:获取流式文件中的当前位置,用相对于文件开头位移量表示
-
返回值:文件位置指示器的位移量()相当于文件头;错误时返回-1L
10.5-文件读写的出错检测
文件读写错误检测函数ferror()
-
原型:
int ferror(FILE *fp);
-
调用形式:
ferror(fp);if (!ferror(fp)){ printf("Error reading from my2.txt.\n");clearerr(fp); }
-
功能:检测文件读写是否正确
-
返回值:返回0,表示未出错;返回非0,表示出错
-
注意:对同一文件,每次调用输入输出函数,都会产生一个新的ferror()函数值,所以,应当调用一个输入输出函数后立即检查该函数的值,否则就会丢失该信息值。在执行fopen函数时,ferror函数的初始值自动置为0
清楚文件错误标志函数 clearerr()
-
原型:
void clearerr(FILE *fp);
-
功能:使文件错误标志和文件结束标志置0
-
调用形式:
clearerr(fp);
-
在调用一个输入输出函数时若出错误,则错误标志一直保留,直到对同一文件调用clearerr( )或rewind( )或其他输入输出函数
文件删除函数 remove()
-
原型:
int remove(char *fname);
-
功能:删除fname所指定的文件
-
若文件已打开,则必须将该文件关闭才能够删除,调用成功,返回0;否则返回-1,并置全局变量errno为ENOENT(无此文件或目录)或EACCES(无此权限)
10.6-补充函数
itos()
-
功能:用函数完成将一个整数转换成字符串(如483→”483”)
-
函数原型:
void itos(int number, char *str);
stoi()
-
功能:用函数完成将一个字符串转换成整数(”483”→483)
-
函数原型:
int stoi(char *str);