文件习题

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);

}

 

上一篇:没事就读


下一篇:C语言——文件