70 likes | 224 Views
文 件 一、文本文件的读写 二、二进制文件的读写. 一、文本文件的读写 文本文件的读写可以是单个字符的读写(用 fgetc/fputc 函数)、字符串读写(用 fgets/fputs 函数)、带格式的读写(用 fscanf/fprintf 函数)。 例:习题集 P211 1 题 编写程序统计指定文件中出现 “ if” , “ while” , “ for” 单词的次数。
E N D
文 件 一、文本文件的读写 二、二进制文件的读写
一、文本文件的读写 文本文件的读写可以是单个字符的读写(用fgetc/fputc函数)、字符串读写(用fgets/fputs函数)、带格式的读写(用fscanf/fprintf函数)。 例:习题集P211 1题 编写程序统计指定文件中出现“if”,“while”, “for”单词的次数。 分析:首先从指定文件中逐个读字符,存入一个一维字符数组中,然后在该数组中分别查找题中所指定的三个单词并计数。具体做法是:编写一个函数,功能是查找指定字符串,统计其出现次数,统计结果作为返回值返回主调函数。主函数输入数据后调用三次函数,完成对 “if”,“while”, “for”的统计。
查找指定字符串函数 int search(char *str,char *fstr) { int m,n=0,l=0; char *ps=fstr; m=strlen(fstr); while(*str!=‘\0’) /*对str指向的字符串逐个扫描 */ { while(*ps!=0) { if(*ps!=*str)break; /*搜索fstr指向的字符串 */ else {ps++; str++; l++;} } if(l>=m) { n++; ps=fstr;} else if(l>=1) ps=fstr; else str++; l=0; } return n; } /*str是指向源数组的指针,fstr是指向要查找字符串的指针。*/
主函数输入数据 FILE *inf; inf=fopen("T1301.TXT","r"); if(inf!=NULL) { while (!feof(inf)) { str[i]=fgetc(inf); i++; } str[i]=‘\0’; } 调用search函数 in=in+search(str,"if"); wn=wn+search(str,"while"); fn=fn+search(str,"for");
二、二进制文件的读写 二进制文件的读写一般使用块读写函数fread/fwrite来实现。数据块的块数及每个数据块的字节数都由用户在函数的参数中指定。 例:习题集P211 4题 编写程序输入100个学生的信息(包括学号、姓名、年龄、7科成绩、自动计算总分),统计所有学生的总分,并按总分由大到小排序存入到二进制数据文件T1304.db中。 分析:按照题目要求,程序应定义结构体数组存放学生信息,然后输入学生信息,计算每个学生的总分,按总分排序,最后再用块写函数fwrite将排序后的数组存入文件T1304.db中。
1)定义结构体数组: #define N 100 struct stu { int no; char name[12]; int age; int sc[7]; int sum; }s[N]; 2)输入学生信息并计算每个学生的总分 N名学生,当然要循环N次,每次输入一个学生的信息,输入时要按成员逐个输入,之后将7科成绩相加,存入成员sum中。
3)按总分由大到小排序 排序可用选择法、冒泡法等。注意一个问题,即本题的数组是结构体数组,两个元素交换时,如果要元素整体赋值,那么所采用的中间变量必须是与数组同类型的结构体变量。例如s[i]与s[j]交换,st=s[i];s[i]=s[j];s[j]=st; 则要定义struct stu st; 要么就将s[i]与s[j]的各成员相互交换。 4)将排序后的数组存入文件T1304.db中 fp=fopen("t1304.db","wb"); for(i=0;i<N;i++) fwrite(&s[i],sizeof(struct stu),1,fp); fclose(fp);