1. 什么是⽂件
磁盘上的⽂件是⽂件。 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。
1.1 程序⽂件
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj(Liunx环境后缀.o),可执⾏程序(windows 环境后缀为.exe)。
1.2 数据⽂件
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。
1.3 文本名
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀.
如:
E:\exe\pow.txt //绝对路径
2.. ⼆进制⽂件和⽂本⽂件
根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
3.⽂件的打开和关闭
3.1流与标准流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据.不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是同流操作的。
3.1.2标准流
stdin 标准输出流
stdout 标准输入流
stderr 标准错误流
3.2⽂件指针
缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针"( FILE* (文件指针) ).
FILE*pf
通过⽂件指针变量能够间接找到与 它关联的⽂件。
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
int main () { FILE * pFile; //打开⽂件 pFile = fopen ("myfile.txt","w"); //⽂件操作 if (pFile!=NULL) { fputs ("fopen example",pFile); //关闭⽂件 fclose (pFile); } return 0; }
可以fclose关闭文件,同时程序结束也会关闭文件。
4.⽂件的顺序读写
4.1顺序读写函数介绍
5.⽂件的随机读写
5.1fseek
根据⽂件指针的位置和偏移量来定位⽂件指针。
int fseek ( FILE * stream, long int offset, int origin );
//stream文件指针
//offset移动位置
//位置 如:SEEK_SET
//SEEK_SET 开头
//SEEK_END 现在位
//SEEK_CUR 末尾
下列实例:
int main() { FILE*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 );
下列实例
int main () { FILE * pFile; long size; pFile = fopen ("myfile.txt","rb"); if (pFile==NULL) perror ("Error opening file"); else { fseek (pFile, 0, SEEK_END); // non-portable size=ftell (pFile); fclose (pFile); printf ("Size of myfile.txt: %ld bytes.\n",size); } return 0; }
5.3rewind
让⽂件指针的位置回到⽂件的起始位置
void rewind ( FILE * stream );
使用实例:
int main () { int n; FILE * pFile; char buffer [27]; pFile = fopen ("myfile.txt","w+"); for ( n='A' ; n<='Z' ; n++) fputc ( n, pFile); rewind (pFile); fread (buffer,1,26,pFile); fclose (pFile); buffer[26]='\0'; printf(buffer); return 0; }
6.⽂件读取结束的判定
牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束.
6.1 被错误使⽤的 feof
当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
1.⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
2.⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
例如:
• fread判断返回值是否⼩于实际要读的个数。
6.2.ferrof判断错误
int main(void) { int c; // 注意:int,⾮char,要求处理EOF FILE* fp = fopen("test.txt", "r"); if(!fp) { perror("File opening failed"); return EXIT_FAILURE; } //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环 { putchar(c); } //判断是什么原因结束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp); }