目录1.什么是文件1.1程序文件1.2数据文件1.3文件名2.二进制文件和文本文件3.文件的打开和关闭3.1流和标准流3.1.1流3.1.2标准流3.2文件指针3.3文件的打开和关闭4.文件的顺序读写5.文件的随机读写5.1fseek5.2ftell5.3rewind6.文件读取结束的判定1.什么是文件磁盘硬盘上的文件是文件。但在程序设计中文件一般包括程序文件和数据文件。1.1程序文件程序文件包括源程序文件(.c),目标文件(.obj),可执行程序(.exe)。1.2数据文件文件的内容不一定是程序而是程序运行时读写的数据。1.3文件名一个文件要有一个唯一的文件标识。文件名包含三部分文件路径文件名主干文件后缀文件标识常被称为文件名。2.二进制文件和文本文件根据数据的组织形式数据文件被称为文本文件或者二进制文件。数据在内存中以二进制的形式存储如果不加转换的输出到外存的文件中就是二进制文件。如果要求在外存上以ASCII码的形式存储则需要在存储前转换。以ASCII字符的形式存储的内存就是文本文件。3.文件的打开和关闭3.1流和标准流3.1.1流程序中的数据需要输出到各种外部设备也需要从外部设备获取数据不同的外部设备的输入和输出操作各不相同为了方便程序员对各种设备进行方便的操作便抽象出了流的概念。C语言程序针对文件、画面、键盘等的数据输入和输出操作都是通过流操作的。一般情况下我们要想向流里写数据或者从流中读取数据都是要先打开流再进行操作。3.1.2标准流C语言程序在启动的时候吗默认打开了3个流stdin-标准输入流在大多数的环境中从键盘输入scanf函数就是从标准输入流中读取数据。stdout-标准输出流大多数的环境中输出至显示器界面printf函数就是将信息输出到标准输出流中。stderr-标准错误流大多数环境中输出到显示器界面。默认打开了这三个流使用scanf和printf等函数就可以直接进行输入输出操作。stdin、stdout、stderr三个流的类型是FILE*通常称为文件指针。3.2文件指针缓冲文件系统中每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息。这些信息是保存在一个结构体变量中。该结构体类型是由系统声明的取名FILE。例如struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;创建FILE*的指针变量FILE* pf;//⽂件指针变量定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区。通过该文件信息区中的信息就能够访问该文件。也就是说通过文件指针变量能够简介找到与它关联的文件。3.3文件的打开和关闭文件在读写之前应该先打开文件在使用结束之后应该关闭文件。在编写程序的时候在打开文件的同时都会返回一个FILE*的指针变量指向该文件也相当于建立了指针和文件的关系。ANSIC规定使用fopen函数来打开文件fclose来关闭文件。//打开⽂件 FILE * fopen ( const char * filename, const char * mode ); //关闭⽂件 int fclose ( FILE * stream );mode表示文件的打开模式下面都是文件的打开模式文件使用方式含义如果指定文件不存在r 只读为输入数据打开一个已经存在的文本文件出错w 只写为输出数据打开一个文本文件建立一个新的文件a 追加向文本文件尾添加数据建立一个新的文件rb 只读为输入数据打开一个二进制文件出错wb 只写为输出数据打开一个二进制文件建立一个新的文件ab 追加向一个二进制文件尾添加数据建立一个新的文件r 读写为了读和写打开一个文本文件出错w 读写为了读和写建议一个新的文件建立一个新的文件a 读写打开一个文件在文件尾进行读写建立一个新的文件rb 读写为了读和写打开一个二进制文件出错wb 读写为了读和写新建一个新的二进制文件建立一个新的文件ab 读写打开一个二进制文件在文件尾进行读和写建立一个新的文件例如#include stdio.h int main () { FILE * pFile; //打开⽂件 pFile fopen (myfile.txt,w); //⽂件操作 if (pFile!NULL) { fputs (fopen example,pFile); //关闭⽂件 fclose (pFile); } return 0; }4.文件的顺序读写函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件上述适用于所有输入流一般指适用于标准输入流和其他输入流如文件输入流所有输出流一般指适用于标准输出流和其他输出流如文件输出流。5.文件的随机读写5.1fseek函数原型int fseek ( FILE * stream, long int offset, int origin );例如#include stdio.h int main () { FILE * pFile; pFile fopen ( example.txt , wb ); fputs ( This is an apple. , pFile ); fseek ( pFile , 9 , SEEK_SET ); fputs ( sam , pFile ); fclose ( pFile ); return 0; }5.2ftell函数原型long int ftell ( FILE * stream );返回文件指针相对于起始位置的偏移量。例如#include stdio.h int main () { FILE * pFile; long size; pFile fopen (myfile.txt,rb); if (pFileNULL) perror (Error opening file); else { fseek (pFile, 0, SEEK_END); // non-portable sizeftell (pFile); fclose (pFile); printf (Size of myfile.txt: %ld bytes.\n,size); } return 0; }5.3rewind函数原型void rewind ( FILE * stream );让文件指针的位置回到文件的起始位置。例如#include stdio.h int main () { int n; FILE * pFile; char buffer [27]; pFile fopen (myfile.txt,w); for ( nA ; nZ ; n) putc ( n, pFile); rewind (pFile); fread (buffer,1,26,pFile); fclose (pFile); buffer[26]\0; printf(buffer); return 0; }6.文件读取结束的判定注意在文件读取过程中不能用feof函数的返回值直接来判断文件的是否结束。feof的作用是当文件读取结束的时候判断是读取结束的原因是都是遇到文件尾结束。文本文件读取是否结束判断返回值是否为EOFfgetc或者NULLfgets例如fgetc判断是否为EOF 。fgets判断返回值是否为NULL 。二进制文件的读取结束判断判断返回值是否小于实际要读的个数。例如fread判断返回值是否小于实际要读的个数。