一般结构:
主文件名[.扩展名]
(1)按文件的逻辑结构分类
➢记录文件 :由具有一定结构的记录组成(定长和不定长)。如数据库文件。
➢流式文件:由一个个字符(字节)数据顺序组成。
(2 )按存储介质分类
➢普通文件:存储介质文件(磁盘、磁带等)。如磁盘文件。
➢设备文件:非存储介质(键盘、显示器、打印机等)。操作系统将外围设备以文件的形式进行统一管理。
(3 )按文件的内容分类
➢程序文件:程序文件又可分为源文件、目标文件和可执行文件。
➢数据文件:如各种图像文件、声音文件等。
(4)根据文件的组织形式分类
➢顺序存取文件。
➢随机存取文件。
(5 )按数据的组织形式分类
➢文本文件:即ASCII文件,ASCII码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)。一般情况下 ,后缀是.txt、 .c、 .cpp、.h、 .hpp、.ini等的文件大多是文本文件。像C语言源程序就是文本文件。文本文件可以按记
事本的方式打开。
➢二进制文件:二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。一般情况下,后缀是.exe、.dIl、 .lib、 .dat、 .doc、 .tif、 .gif、 .bmp 的文件大多是二进制文件。像C语言的执行文件就是二进制文件。二进制文件一般是不可以记事本方式打开的,即使打开,看起来也都是一些“乱码”。下图给出了十进制数据 32767在文本文件及二进制文件中的存放形式。
-
读文件与写文件
读文件: 将磁盘文件中国呢的数据传送到计算机内存的操作.
写文件: 从计算机内存向磁盘文件中传送数据的操作. -
构成文件的基本单元与流式文件
C语言将文件看作由一个一个的字符或字节组成
C语言本身没有提供输入输出的功能, 必须调用标准库函数进行文件读写. -
缓冲文件系统
将系统自动地在内存区为每个正在使用的文件开辟一个缓冲区.
从内存向磁盘输出数据时,必须首先输出到缓冲区中.
-
文件结构体 FILE
C的标准库函数每操作一个文件, 都为这个文件建立一个FILE型变量. -
文件类型指针
C语言按照流文件方式操作文件的过程中要用到上述定义的文件结构体的指针, 即文件指针.
但程序员只能获取FILE型的指针,这个指针所指向的FILE型变量存放着所操作文件的基本信息.
FILE *fp
C语言程序在操作文件时必须遵从“打开–读写–关闭”的操作流程.
12.5.1 文件的打开与关闭- 打开文件
C语言打开文件要调用fopen函数
FILE *fopen(char *filename, char *mode);
filename是一个字符串, 表示要打开的文件名,文件名前面可以带路径. 注意要写双引号
mode也是一个字符串, 表示打开文件的方式.
功能----按指定方式打开文件.
返回值 ---- 如果文件打开成功,则返回该文件结构体的指针,如果打开失败,则返回NULL.
FILE *fp;
fp = fopen("wang.txt","r");
if(fp == NULL)
{
printf("the file : wang.txt not found!");
exit(-1);
}
//如果以写的方式打开C盘bak目录下的二进制文件wang.bat,
//调用fopen函数的语句需要改: fp = fopen("C:\bak\wang.dat","wb");
在程序开始运行时, 系统自动打开如下三个标准文件,并分别定义了文件指针.
标准输入文件------- stdin :指向终端输入(一般为键盘)如果程序中指定要从stdin所指的文件输入数据, 就是从终端键盘上输入数据。
标准输出文件------- stdout : 指向终端输出(一般为显示器)
标准错误文件------- stderr : 指向终端标准错误输出(一般为显示器)
- 关闭文件
调用fclose函数
int *fclose(FILE *filepointer);
说明:
filepointer 是文件指针, 通常这个参数就是fopen 函数的返回值;
功能 : 关闭文件指针所指向的文件.
返回值 : 如果正常关闭了文件 , 则函数返回值为0, 否则,返回非0
FILE *fp;
fp = fopen("wang.txt","r+");
if(fp == NULL)
{
printf("the file: wang.txt not found!");
exit(-1);
}
...
fclose(fp); //关闭该文件
12.5.2 文件的读写
函数主要包括:
- 字符读写函数 fgetc 和 fputc
(1) fgetc 函数原型
int fgetc(FILE *filepointer);
功能: 从文件指针filepointer中, 读入一个字节(字符), 同时将读写位置指针向前移动1个字节(即指向下一个字符).
返回值: 如果读取正常, 返回读到的字节值; 如果读到的文件尾或出错, 则返回EOF
(2) fputc 函数
int fputc(int c, FILE *filepointer);
功能: 将字符数据C输出到文件指针filepointer 所指向的文件中去, 同时将读写位置指针向前移动一个字节(即 指向下一个写入位置)
返回值: 成功, 返回值就是输出的字符数据C, 否则,返回EOF
//输入字符并存储到指定文件中 for( ; (ch = getchar())!='@'; ) fputc(ch,fp1);//输入字符并存储到文件中 fclose(fp1); //关闭文件 //顺序输出文件的内容 fp2 = fopen(argv[1] , "rt"); for( ; (ch = fgetc(fp2))!=EOF;) putchar(ch); //顺序读入并显示 fclose(fp2); //关闭打开的文件 //复制原文件到目标文件中 FILE *input, *output; //input: 原文件指针, output:目标文件指针 for( ; (!feof(input)) ;) fputc(fgetc(input),ouput); fclose(input);//关闭原文件; fclose(ouput);//关闭目标文件
判断文件是否结束的库函数feof
int feof (FILE *filepointer);
功能:在执行读文件操作时,如果遇到文件尾,则函数返回逻辑真(1);否则,则返回逻辑假(0).
!feof(input)表示源文件(用于输入)为结束,循环继续
fgetc和 fputc函数多次提到文件读写位置指针,有什么用? 与文件指针指针有什么不同?
在文件内部有一个位置指针, 用来指向文件的当前读写字节.
文件打开时, 该指针总是指向文件的第一个字节. 使用fgetc函数后, 该位置指针将向后移动一个字节. 因此可连续使用fgetc函数,读取多个字符.
但应注意文件指针和文件内部的位置指针不是一回事, 文件指针是指向整个文件的, 需要在程序中定义说明,只要不重新赋值, 文件指针的值是不变的.
文件内部的位置指针用于表示文件内部的当前读写位置. 每读写一次,该指针均向后移动. 不需要定义说明.
- 字符串读写函数fgets 和fputs
字符串读写函数fgets 和fputs 是以字符串的形式对文件进行读写的函数, 每次可以从文件读出(指定长度)或向文件写入一个字符串.
(1)fgets函数
char *fgets(char *s, int n, FILE *filepointer);
功能: 从文件指针 filepointer 所指向的文件中, 读取长度最大为n-1的字符串,并在字符串的末尾加上结束符号’ ’,然后将字符串存放到S中.
同时将读写位置指针向前移动实际读取的字符串长度(≤n-1 )个字节。当从文件中读取第n- 1个字符后或读取数据过程中遇到换行符‘n’后,函数返回。因此, s中存放的字符串的长度不一定正好是n- 1。
返回值: 如果操作成功,返回 字符串指针, 失败返回NULL.
(2) fputs函数
int fputs(char *s, FILE *filepointer);
功能:**将存放在s中的字符串写到文件指针filepointer 所指向的文件中去,同时将读写位置指针向前移动字符串长度个字节。**注意, fputs函数不会将字符串结尾符’ ’写入文件,也不会自动向文件写入换行符,如果需要写入一行文本,s字符串中必须包含^n’。
返回值:如果操作成功,函数返回值就是最后写入文件的字符值;否则,返回EOF。
- 数据块读写函数fread和 fwrite
(1) fread函数
unsigned fread(void *ptr, unsigned size, unsigned n, FILE *filepointer);
功能: 从filepointer 所指向的文件中读取N个数据项, 每个数据项的大小是 size个字节, 这些数据将被存储到ptr所指向的内存中, 同时, 将读写位置指针向前移动 n * size个字节,
返回值: 成功,返回值就是读取的数据项的个数(不是字节个数), 出错或者遇到文件尾,返回0
(2) fwrite 函数
unsigned fwrite(void *ptr, unsigned size, unsigned n, FILE *filepointer);
功能: 将ptr所指向的内存中存放的N个大小为SIZE个字节的数据项写入到filepointer所指向的文件中, 实际要写入数据的字节数是 n * size. 同时, 将读写位置指针向前移动 n * size 个字节.
返回值: 成功,返回值就是实际写入的数据项的个数, 出错,返回0
fread和 fwrite 一般用于二进制文件的输入和输出.
- 格式化读写函数fscanf 和 fprintf
这两者的功能和输出函数scanf printf相似, 区别在于fscanf``fprintf函数的操作对象是指定文件, 而scanf和printf函数的操作对象是标准输入(stdin)和输出(stdout)文件,即键盘和显示器.
(1)fscanf函数
int fscanf(FILE *filepointer, const char *format[,address,..])
功能 : 从filepointer 所指向的文件中读取数据。除了多了一个文件指针的参数外,其他方面与scanf函数完全相同。
返回值 : 如果操作成功,则函数返回值就是读取的数据项的个数;如果操作出错或遇到文件尾,则返回EOF。
(2)fprintf函数
int fprintf(FILE *filepointer, const char *format[,address,....]);
功能 : 将表达式输出到filepointer所指向的文件中,除了多了一个文件指针的参数外, 其他方面与printf函数完全相同.
返回值 : 如果操作成功, 则函数返回值就是写入到文件中数据的字节个数, 如果操作出错,返回EOF.
fpritnf(fp,"%d,%6.2f",i,t); //将i和t按%d, &6.2f格式输出到FP文件中 fscanf(fp,"&d,&f",&i,&t);// 若文件中有3,4.5,则将3送入i,4.5送入t
注意 : 文件格式化输出函数fprintf总是以字符串的形式将数据信息存放到文件中 , 而不是以数值的形式存放到文件中, 不管打开的是文本文件还是二进制文件.
12.5.3 文件读写函数选用原则fread()``fwrite()函数可以完成文件的任意数据读/写操作.
读/写1个字符(或字节)数据时:选用fgetc( )和fputc( )函数。
读/写1个字符串时:选用fgets( )和fputs( )函数。
读/写1个(或多个)不含格式的数据时:选用fread( )和fwrite( )函数。
读/写1个(或多个)含格式的数据时:选用fscanf( )和fprintf( )函数。
对使用文件类型的要求:
12.6 文件的定位读写fgetc( )和fputc( )函数主要对文本文件进行读写,但也可对二进制文件进行读写。
fgets( )和fputs( )函数主要对文本文件进行读写,对二进制文件操作无意义。
fread( )和fwrite( )函数主要对二进制文件进行读写,但也可对文本文件进行读写。
fscanf( )和fprintf( )函数主要对文本文件进行读写,对二进制文件操作无意义。
随机读写:可以移动文件内部的位置指针到需要读写的位置,在进行读写.
实现随机读写的关键是按要求移动位置指针, 这称为文件的定位.
(1)rewind函数
void rewind(FILE *filepointer);
功能: 将filepointer 所指向的文件的位置指针重新置回到文件的开头.
返回值: 无
(2)fseck函数
int fseek(FILE *filepointer, long offset, int whence);
功能: 将filepointer所指向的文件的位置指针移动到特定的位置. 这个位置由whence和offset决定,即将位置指针移动到距离whence的offset字节处, whence的值见下表
如果offset为正值, 表明新的位置在whence的后面, 如果whence是负值,表明新的位置在whence的前面.
(3)ftell
long ftell(FILE *filepointer)
功能: 返回filepointer所指向的文件的当前位置指针的值(用相对文件开头的位移量表示)
返回值: 如果操作成功,返回当前位置指针的值. 如果出错,返回-1L
//求文件的长度 #include#include void main(int argc, char *argv[]) { FILE *fp; long length; if(argc != 2) //命令行参数有误 { printf("Useage : 执行文件名 filenamen"); exit(0); } fp = fopen(argv[1],"rb");//以读的方式打开文件 if(fp == NULL) //打开文件失败 { printf("file not found!n"); exit(0); } fseek(fp, 0L,SEEK_END)// 文件位置指针指向文件尾. length = ftell(fp); //取文件位置指针当前的位置, 即文件的长度 printf("Length of file is %ld bytesn",length); //显示文件的长度 fclose(fp); //关闭文件 }



