1:磁盘文件gstudent存放研究生数据,学号,姓名,地址,专业
1):学号 姓名 专业抽出来新建一个‘简明的研究生专业’文件 输出新建后的数据
1 a 专业
2 b 专业
3 c 专业
4 d 专业
2):简明的研究生专业文件中删除一个学号为3的研究生的专业数据,输出删除后的数据
1 a专业
2 b专业
4 d专业
//学号,姓名,地址,专业 struct student { char num[2]; char name[4]; char add[5]; char spec[5]; }stud1[4]={ "1","11","111","1111", "2","22","222","2222", "3","33","333","3333", "4","44","444","4444"},stud[4]; struct tmp { char num[2];
char name[4];
char spec[5];
}estu[4]; void main() { FILE *crea; int i; crea=fopen("G:/yjs.dat","w"); if(crea==NULL) { printf("crea==NULL"); return; } for(i=0;i<4;i++) { fwrite(&stud1[i],sizeof(struct student),1,crea); } fclose(crea); fun(); } void fun() { FILE *fp1,*fp2; int i; fp1=fopen("G:/yjs.dat","r"); fp2=fopen("G:/yjs1.dat","w+"); if(fp1==NULL) { printf("fp1==NULL"); return; } if(fp2==NULL) { printf("fp2==NULL"); return; } for(i=0;fread(&stud[i],sizeof(struct student),1,fp1)!=0;i++)//输入N个数据放入数组 { //fgets(&stud[i],sizeof(struct student),fp1)!=NULL printf("第%d行\n",i+1); printf("num=%2s name=%4s add=%5s spec=%5s\n",stud[i].num,stud[i].name,stud[i].add,stud[i].spec); strcpy(estu[i].num,stud[i].num);
strcpy(estu[i].name,stud[i].name);
strcpy(estu[i].spec,stud[i].spec); } printf("原文件输出结束\n"); for(i=0;i<4;i++) { printf("estu:%s %s\n",estu[i].num); fwrite(&estu[i],sizeof(struct tmp),1,fp2); //fputs(&estu[i],fp2); } fclose(fp1);fclose(fp2); fun3(); } void fun3() { FILE *fp1; int i; fp1=fopen("G:/yjs1.dat","r+"); if(fp1==NULL) { printf("fp3==NULL"); return; } printf("删除前:\n"); for(i=0;fread(&estu[i],sizeof(struct tmp),1,fp1)!=0;i++) { printf("%s\n",estu[i].num); } fclose(fp1); fp1=fopen("G:/yjs1.dat","w+"); if(fp1==NULL) { printf("fp1==NULL"); return; } for(i=0;i<4;i++) { if(strcmp(estu[i].num,"3")!=0) { fwrite(&estu[i],sizeof(struct tmp),1,fp1); } } fclose(fp1); printf("删除后:\n"); fp1=fopen("G:/yjs1.dat","r+"); if(fp1==NULL) { printf("fp1==NULL"); return; } for(i=0;fread(&estu[i],sizeof(struct tmp),1,fp1)!=0;i++) { printf("%s\n",estu[i].num); } fclose(fp1); }
2:9-3-11成绩管理系统,学生信息学号,姓名,年龄,性别,三门成绩
1:键盘输入n个学生成绩,存入file类型文件
2:从上述文件读入成绩,按学号为序打印一张成绩情况表
typedef struct { int no; char name[10]; int age; char sex[2];//f女性,m男性 int sc1,sc2,sc3; }student; void main() { fun1(); fun2(); } void fun1() { FILE *fp; student stu; int i; fp=fopen("G:/stu.txt","wb"); if(fp==NULL) { printf("fp==NULL"); return; } for(i=0;i<N;i++)//输入N个学生放入数组 { printf("第%d个\n",i+1); scanf("%d %s %d %s %d %d %d",&stu.no,stu.name,&stu.age,stu.sex,&stu.sc1,&stu.sc2,&stu.sc3); fwrite(&stu,sizeof(student),1,fp);//重要 } fclose(fp); } void fun2() { FILE *fp; student stu[N],temp; int i,j; fp=fopen("G:/stu.txt","rb"); if(fp==NULL) { printf("fp==NULL"); return; } for(i=0;i<N;i++) { fread(&stu[i],sizeof(student),1,fp); } fclose(fp); for(i=1;i<N;i++) { temp =stu[i]; for(j=i-1;j>=0&&temp.no<stu[j].no;j--) { stu[j+1]=stu[j]; } stu[j+1]=temp; } printf("输出信息:\n"); for(i=0;i<N;i++) { printf("%d %s %d %s %d %d %d\n",stu[i].no,stu[i].name,stu[i].age,stu[i].sex,stu[i].sc1,stu[i].sc2,stu[i].sc3); } }
3:调用函数readdat()实现从文件test.dat(每行宽度小于80个字符)读取一片英文文章,存入字符串数组zz中,调用encryptchar()
按下边给定的替代关系对数组xx中所有字符进行替代,仍存入zz的对应位置上,最后调用writedat()把结果输入到文件test1.dat
f(p)=p*11/256 为阿斯克码
*fgets(char *str, int n, FILE *stream) 返回读取到的字符串,即string;失败或读到文件结尾返回NULL。 fputs (str, fp) 把str中‘\0’结束符之前的全部文字输入到文件中。输入完成后,不会增加额外的特殊字符,如换行符等。
#define zimu(x) (x>='A'&&x<='z') FILE *fp,*fp2; char zz[256]; void main() { fp=fopen("G:/test.dat","r"); fp2=fopen("G:/test1.dat","w"); printf("fp1\n"); if(fp==NULL) { printf("fp==NULL"); return; } if(fp2==NULL) { printf("fp2==NULL"); return; } readdat(); fclose(fp); fclose(fp2); } char encryptchar(char tem)//对字符进行替代 { char re; int ch,f; ch=(int)tem;//原本 f=((int)tem*11)%256;//计算后 if(ch%2==0||f<=32){re=tem;} else{re=(char)f;} return re; } void readdat()//从test.dat读取文章 { printf("fp2\n"); int k; while(fgets(zz,80,fp)!=NULL)//每次读取一行 { printf("fp3 zz=%s\n",zz); k=0; while(zz[k]!='\n') { if(!zimu(zz[k]))//如果是特殊字符 { zz[k]=zz[k]; printf("zz[%d]=%c ",k,zz[k]); k++; continue; } while(zimu(zz[k]))//如果是字符 { zz[k]=encryptchar(zz[k]); printf("zz[%d]=%c ",k,zz[k]); k++; } } printf("\n"); zz[k++]='\n'; zz[k]='\0'; writedat(); } } void writedat()//写入到test1.data { printf("fp5 zz=%s\n",zz); fputs(zz,fp2); }
4:将指定文本中所有某个单词替换成另一个
void main() { char buff[256],tem[256],*h; FILE *fp,*fp2; fp=fopen("G:\\a.dat","r"); if(fp==NULL) { printf("无法打开%s文件",p[1]); return ; } fp2=fopen("G:/b.txt","w"); if(fp2==NULL) { printf("无法打开%s文件",p[2]); return ; } while(fgets(buff,256,fp)!=NULL) { printf("1:%s\n",buff); h=str_replace(buff); fputs(h,fp2); } fclose(fp); fclose(fp2); } char *str_replace(char str[]) { int i=0,j=0,k,n,m; char newstr[]="pp"; char oldstr[]="aaaa"; char temp[256]; char *s=temp;//替换过后的一行 char block[20];//存放单词块 while(str[i]!='\n') { k=0; n=i; if(!zimu(str[i])) { temp[j++]=str[i]; i++; printf("111:temp[%d]%c ",j-1,temp[j-1]); printf("\n"); continue; } while(zimu(str[n])) { block[k]=str[n]; printf("411:block[%d]%c ",k,block[k]); n++;k++; } block[k]='\0';//这一点很重要,是比较的出错点 printf("\n"); printf("511strcmp(oldstr,block)=%d\n",strcmp(oldstr,block)); if(strcmp(block,"aaaa")==0)//找到了 { for(m=0;m<strlen(newstr);m++) { temp[j++]=newstr[m]; printf("211:temp[%d]%c ",j-1,temp[j-1]); } printf("\n"); }else { for(m=0;m<k;m++) { temp[j++]=block[m]; printf("311:temp[%d]%c ",j-1,temp[j-1]); } } i=n;//别忘了 } temp[j++]='\n'; temp[j]='\0';//这点很重要,每行有个终止符·写入文件到此停止 printf("tempall:%s",temp); printf("\n"); return s; }
5:字符流读入一个文件,从文件检索出6中c语言的关键字,统计,输出每种关键字出现的次数。单词以空格或\t,\n结束
struct key { char word[10]; int count; }keyword[]={"if",0,"while",0,"break",0,"continue",0,"do",0,"for",0}; FILE *fp;//全局变量,保证一直往前走 char buf[100];int num;//全局变量buf,每次存入字符后以\0结束,便于lookup void main() { int i;char *word; if((fp=fopen("G:/test.dat","r"))==NULL) { printf("读取失败"); return ; } num=sizeof(keyword)/sizeof(struct key);//关键字个数 while((word=getword(fp))!=NULL) //循环条件:1:每次执行完getword fp的位置都会指向下一个单词开头:2:执行完lookup后,继续判断循环条件 { printf("word %s\n",*fp); lookup(word); } fclose(fp); printf("统计:\n"); for(i=0;i<num;i++) { printf("keyword=%s,count=%d\n",keyword[i].word,keyword[i].count); } } char *getword(FILE *fp)//获取单词 { printf("getword 1 buf=%s\n",buf); int i;char c; //单词的第一个字母, //1:若为特殊符号且不为终止符循环下去,直到找到字符/终止符,此时指针指向此处 // fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动 //fp为全局变量,下次getword从该处继续前行 while((c=fgetc(fp))!=EOF&&(c==' '&&c=='\t'&&c=='\n')) printf("getword 2\n"); //2:该字符若为终止符就退出 if(c==EOF)return 0; //3:若为字符存到缓冲区第一个字母 else { buf[i++]=c; printf("getword 3 i=%d c=%c\n",i-1,c); } //单词的其余字符 //1:指针继续前行,字符存入缓冲区,遇到终止符,特殊字符停止 while((c=fgetc(fp))!=EOF&&(c!=' '&&c!='\t'&&c!='\n')) { buf[i++]=c; printf("getword 4 i=%d c=%c\n",i-1,c); } buf[i]='\0';//加上终止符,找字符时遇到终止符停止 return buf;//返回缓冲区 } void lookup(char *p)//将缓冲区字符与关键字比较 { int i;char *q,*s; printf("lookup 1 p=%s\n",p); for(i=0;i<num;i++) { q=&keyword[i].word[0];//指向关键字 s=p;//s指向缓冲区 while(*s&&*s==*q) { s++;q++; } if(*s==*q) { keyword[i].count++; break;//跳出for循环, } } }
6:将输入的三个3位整数用fprintf(fp,"%d",x)的格式存入新建文件test.dat再用fgetc函数读出并在屏幕输出
void main() { FILE *fp; char ch; int a[3]={1,2,3},i; if((fp=fopen("G:/test.dat","w"))==NULL) { printf("不能打开"); return; } for(i=0;i<3;i++) { fprintf(fp,"%d",a[i]);//输入文件 } fclose(fp); fp=fopen("G:/test.dat","r"); while((ch=fgetc(fp))!=EOF) { printf("%c",ch); } fclose(fp); }
7:编写程序 指出给定文本文件中,第几行是最长的行,以及该行的字符个数
int main() { int len=0,maxlen=0,line=0,maxline=0; char ch; FILE *fp; if((fp=fopen("G:/mqrw.txt","r"))==NULL) { printf("打不开\n"); return; } while((ch=fgetc(fp))!=EOF) { if(ch=='\n')//换行 { line++; if(len>maxlen) { maxlen=len; maxline=line; } len=0; } else len++; } printf("%d 行,字数%d",maxline,maxlen); fclose(fp); }