一.文件分类
根据数据的组织形式,数据文件可以分为ASCII文件和二进制文件。
1.二进制文件:数据在内存中是以二进制的形式存储的,如果不加转换地输出到外存上,就是二进制文件,可以认为它就是存储在内存的数据的映像,所以也称之为映像文件(image file)。
2.ASCII文件:如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换,ASCII文件又称文本文件(text file),每一个字节放一个字符的ASCII代码。
二.文件缓冲区
在处理数据时,系统自动地在内存区为程序每一个正在使用的文件开辟一个文件缓冲区。从内存向磁盘输入数据,必须先要送到内存中的缓冲区,装满缓冲区后才一起送到磁盘中。如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,充满缓冲区后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。
通常情况下,缓冲区的刷新(清空)有以下几种情况:
1.缓冲区满时;
2.行缓冲区遇到回车时;
3.关闭文件;
4.使用特定函数刷新缓冲区。
在具体的文件编程操作过程中,因为环境的原因经常可能会发生数据写入不进文件中,可能的原因就是缓冲区的数据没有及时的送出。
三.文件类型指针
缓冲文件系统中,每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件信息(如文件的名字、文件状态、文件当前位置等),这些信息是保存在一个结构体变量中的。该结构体是由系统声明的,取名为FILE,其声明信息包含在头文件"stdio.h"中。
通常情况下,在操作文件时不通过对变量名的引用来引用文件,而是设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量,这样更方便。
四.打开和关闭文件
1.打开文件
函数原型:
FILE *fopen( const char * filename, const char * mode );
其中filename为文件名,mode定义了文件的打开方式,具体类型如下:
2.关闭文件:
函数原型:
int fclose( FILE *fp );
代码示例:
#include<stdio.h> int main() { FILE*tp; if((tp=fopen("C:\\Users\\猪英俊\\Desktop\\aaa.txt","w+"))==NULL) printf("the file is not exist"); if(fclose(tp)!=0) printf("cannot close the file"); return 0; }
以上代码执行后会在指定的绝对路径下创建名称为aaa.txt的文件,如果已经有相同名称的文件存在则打开文件。然后fclose()函数关闭文件,程序结束。
五.文件写入和读取
1.向文件写入和读取字符:
函数原型:
int fputc(char ch,FILE *stream);
int fgetc(FILE *stream);
fputc()把字符ch写到文件指针变量stream所指向的文件中,输出成功,会返回相应的输出字符,输出失败,则返回EOF(即-1)。
fgetc()从stream指向的文件读入一个字符,读成功,会带回所读的字符,失败则返回文件结束标志EOF(即-1)。
代码示例:
#include<stdio.h> int main() { FILE*tp; if((tp=fopen("aaa.txt","r+"))==NULL) printf("the file a is not exist"); char ch=fgetc(tp); if(fclose(tp)!=0) printf("cannot close the file a"); if((tp=fopen("bbb.txt","w+"))==NULL) printf("the file b is not exist"); fputc(ch,tp); if(fclose(tp)!=0) printf("cannot close the file b"); return 0; }
上述示例代码会把原先创建好的一个名叫aaa.txt的文件的一个字符复制到名叫bbb.txt的文件中。
2.向文件写入和读取字符串:
函数原型:
int fputs(char *string,FILE *stream);
char *fgets(char *string,int n,FILE *stream);
fputs会将字符指针string所指向的字符串输入到stream文件指针变量所指向的文件中,输出成功返回0,否则返回非0值。
fgets从stream指向的文件读入一个长度为(n-1)的字符串,存放到字符数组string中,读取成功,返回地址str,失败返回NULL。
3. 用格式化方式读写文件
函数原型:
int fprintf(FILE *stream,char *format,variable-list);
int fscanf(FILE *stream,char *format,variable-list);
以上两个函数与printf函数和scanf函数相似,都是格式化读写数据。
示例:
fprintf(tp,"%d,%6.2f",i,f);
其作用是将int型变量i和float型变量f的值按%d和%6.2f的格式输出到tp指向的文件中。若i=3,f=4.5,则输出到文件中的内容是以下字符:3, 4.50
4.用二进制形式向文件读取一段数据
C语言允许用fread函数从文件中读入一个数据块,用fwrite函数向文件写一个数据块。在读写时是以二进制的形式进行的。在向磁盘写数据时,直接将内存中一组数据原封不动、不加转换地复制到磁盘文件上,在读入时也是将磁盘文件中若干字节的内容一批读入内存。
函数原型:
size_t fwrite(const void*buffer,size_t size,size_t count,FILE*tp);
size_t fread(const void*buffer,size_t size,size_t count,FILE*tp);
其中:
buffer:是一个指向保存结果地址的指针。
size:定义读写的字节数。
count:指定需要读写多少个数据项(每个数据项的长度为size)。
tp:FILE类型的指针。
代码示例:
(1)写入int型:
#include<stdio.h> int main() { FILE*tp; int buffer[]={1,2,3,4}; if((tp=fopen("aaa.txt","w+"))==NULL) printf("the file is not exist"); fwrite(buffer,sizeof(int),sizeof(buffer)/sizeof(buffer[0]),tp); if(fclose(tp)!=0) printf("cannot close the file"); return 0; }
(2)读入int型:
#include<stdio.h> int main() { FILE*tp; int buffer[4]; if((tp=fopen("aaa.txt","r+"))==NULL) printf("the file is not exist"); if(fread(buffer,sizeof(int),4,tp)!=4) printf("cannot read from file"); if(fclose(tp)!=0) printf("cannot close the file"); int i=0; for(i=0;i<4;i++) printf("%d\n",buffer[i]); return 0; }
结果:
(3)写入结构体:
#include<stdio.h> #include<string.h> int main() { FILE*tp; int i=0; typedef struct{ int age; char name[30]; }People; People per[3]; per[0].age=12;strcpy(per[0].name,"zou"); per[1].age=13;strcpy(per[1].name,"wang"); per[2].age=14;strcpy(per[2].name,"huang"); if((tp=fopen("aaa.txt","r+"))==NULL) printf("the file is not exist"); for(i=0;i<3;i++) { if(fwrite(&per[i],sizeof(People),1,tp)!=1) printf("cannot write to file"); } if(fclose(tp)!=0) printf("cannot close the file"); return 0; }
(4)读出结构体:
#include<stdio.h> #include<string.h> int main() { FILE*tp; int i=0; typedef struct{ int age; char name[30]; }People; People per[3]; if((tp=fopen("aaa.txt","r+"))==NULL) printf("the file is not exist"); for(i=0;i<3;i++) { if(fread(&per[i],sizeof(People),1,tp)!=1) printf("cannot read from file"); } if(fclose(tp)!=0) printf("cannot close the file"); for(i=0;i<3;i++) { printf("%d\t%s\n",per[i].age,per[i].name); } return 0; }
结果:
原文地址:https://www.cnblogs.com/zhuyinjunblog/p/10503129.html