这两天敲一个小例子——学生信息管理系统,其中需要用到对学习信息的保存和读取操作,这些有关文件操作如下:
1、将文件的信息读取到变量中
<span style="font-family:KaiTi_GB2312;font-size:24px;">//从文件d:/student.bin读取信息到变量中 void readfile( FILE *fp, int &StuAmount, Stu Student[] ) { if((fp=fopen("d:/student.bin","r"))==NULL) //判断是否打开文件 { if((fp=fopen("d:/student.bin","w"))==NULL) { printf("\n\t\t文件student.bin不存在。\n"); printf("\n\t\t文件student.bin建立失败,程序中断。"); exit(0); } } fseek(fp,0,2); //文件位置指针移动到文件末尾。 if(ftell(fp)>0) //文件不为空。 { rewind(fp); //文件位置指针移动到文件开始位置。 for(StuAmount=0;!feof(fp) && fread(&Student[StuAmount],sizeof(struct Stuinfo),1,fp);StuAmount++); //文件导入。 } }</span>
fopen函数:该函数原型为FILE * fopen(const char * path,const char * mode);第一个参数为文件的路径和文件名,第二个参数为打开的方式选择。函数打开文件成功会返回一个指向文件的指针,失败会返回NULL。对于打开文件的方式有:r:只读的方式。w:只写方式,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。a:追加方式,若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾。r+、w+、a+:是针对可读写文件,作用同上方r、w、a,说明:具体的情况有时要看相应的编译器。
fseek函数:该函数的功能为重定位文件内部位置指针,其函数原型为:int fseek(FILE *stream, long offset, int fromwhere)。如果执行成功stream将指向以fromwhere为基准,偏移offset个字节的位置;针对fromwhere可以用0代表文件头,1代表当前位置,2代表文件末尾。
ftell函数:该函数的原型为:long ftell(FILE *stream);其功能为返回文件位置指针当前位置相对于文件首的偏移字节数。
rewind函数:用于将文件内部的指针重新指向一个文件开始位置。
feof函数:用来判断文件是否结束,如果遇到文件结束,函数返回值值为非零值,否则为0。
fread函数:该函数的原型为:size_t fread( void * buffer, size_t size,size_t count, FILE * stream );第一个参数为开始读入数据的内存地址,第二个参数说明每个数据项的大小,第三个参数指明要读入多少个数据项,第四个参数指明数据流。
2、文件的写入
<span style="font-family:KaiTi_GB2312;font-size:24px;">//文件写入 void writeToFile(FILE *fp, int StuAmount, Stu Student[]) { int i; if((fp=fopen("d:/student.bin","w"))==NULL) { printf("\n\t\t文件打开失败"); exit(0); } for(i=0;i<StuAmount;i++) { if(fwrite(&Student[i],sizeof(struct Stuinfo),1,fp)!=1) { printf("\n\t\t写入文件错误!\n"); } } fclose(fp); printf("\n\t\t通讯录文件已保存在d:/student.bin中。"); }</span>
fwrite函数:该函数用来向文件写入一个数据块。函数原型为:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);该函数的用法与上边的fread是相似的。
fclose函数:用来关闭一个文件流,它可以对文件最后的缓冲区做好释放等相关的处理操作。
3、学生信息保存
<span style="font-family:KaiTi_GB2312;font-size:24px;">//将学生信息保存到d:/学生成绩统计.txt中(从OutputStuNo开始打印,StuAmount学生总数,OutputAmount需要打印的学生数目。) void OutputOne(int OutputStuNo,Stu Student[],int StuAmount,int OutputAmount) { FILE *fp; if((fp=fopen("d:/学生成绩信息统计.txt","wb"))==NULL) { printf("Can not open \"d:/学生成绩信息统计.txt\".\n"); fclose(fp); return ; } fprintf(fp,"\n 学生成绩表\n\n"); fprintf(fp," 学号 姓名 数学 外语 计算机 C语言 语文 平均成绩 名次\n"); for(int i=OutputStuNo;i<OutputAmount;i++) fprintf(fp," %8d %8s %7d %7d %7d %7d %7d %7d %7d\n",Student[i].StuNo, Student[i].StuName, Student[i].StuMathScore, Student[i].StuEnglishScore, Student[i].StuComputerScore, Student[i].StuCPramScore, Student[i].StuChineseScore, Student[i].StuAverScore, Student[i].StuPlace ); fclose(fp); printf("Student's data have saved into \"d:/学生成绩信息统计.txt\".\n"); }</span>
原文地址:http://blog.csdn.net/rcj183419/article/details/46047899