关于#C语言 #文件末尾出现一堆“屯”的问题

写一个歌手评分系统,打开文件之后,将数据fprintf和fscanf,数据正常录入,但是文件中末尾出现一堆“屯”(开发环境是vc6.0)部分代码如下:


int main()
{
    int a,b,d; 
    //a代表要进行的某个操作;b为需要录入的选手的人数;d为需要追加的选手的人数
    int n,i;  //n为选手编号
    int m;  //m为追加选手数据后的选手人数
    

    FILE *fp;
    fp=fopen("Campus Singer Grand Prix scoring system.txt","wt+");  
    //“wt+”读写打开或建立一个文本文件,允许读写

    //判断文件是否打开失败
       if(fp==NULL)
    {
          printf("文件打开失败!\n");
        exit(0);  //打开失败则退出程序
    }else{
        printf("打开成功!\n");
    }


     printf("*********************************************************************\n");
     printf("***************欢迎进入校园歌手大奖赛评选系统***************\n");
     printf("*********************************************************************\n");
     printf("*  该系统有如下六个操作:                                                    *\n");
     printf("*     (1)输入选手数据;                                                              *\n");
     printf("*     (2)评委(五位)打分(请保留小数点后一位);                *\n");
     printf("*     (3)成绩排序(按平均分);                                                *\n");
     printf("*     (4)数据查询;                                                                      *\n");
     printf("*     (5)追加歌手数据;                                                               *\n");
     printf("*     (6)写入数据文件;                                                               *\n");
     printf("*     (7)系统退出。                                                                    *\n");
     printf("***********************************************************************\n");
   8  printf("**********************************************************************\n");


    while(1)
    {

    
        printf("请选择你想要的操作(1~7):");
        scanf("%d",&a);
        
        printf("\n\n\n");

        switch(a)
        {

            case 1:

                printf("你选择的操作是:(1)输入选手数据\n");
                printf("请选择你要输入的选手的个数:");
                scanf("%d",&b);

                Singer_data(b);
                printf("\n-------------------------------------\n");

                break;

            case 2:

                printf("你选择的操作是:(2)评委(五位)打分(请保留小数点后一位)\n");

                printf("请输入选手人数:");
                scanf("%d",&b);

                printf("满分为十分,请打分\n");
               
                Singer_score(b);
                printf("\n---------------------------------------------------------\n");

                break;


            case 3:

                printf("你选择的操作是:(3)成绩排序(按平均分)\n");

                printf("请输入选手人数:");
                scanf("%d",&b);

                Singer_result(b);
                sort(b);
                printf("\n-----------------------------------------\n");

                break;


            case 4:


                printf("你选择的操作是:(4)数据查询\n");

                printf("请输入你想查找的选手的编号:");
                scanf("%d",&n);

                find(n);
                printf("\n----------------------------\n");

                break;


            case 5:

            

                printf("你选择的操作是:(5)追加歌手数据\n");

                printf("请输入已录入的选手的人数:");
                scanf("%d",&b);
                printf("请输入需要追加的选手的人数:");
                scanf("%d",&d);
                
                m=b+d;

                addition(b,d);
                printf("将进行自动排序----\n");

                Singer_result(m);
                sort(m);

                printf("\n----------------------------------\n");

                break;


            case 6:

                printf("你选择的操作是:(6)写入数据文件\n");

            
            printf("请输入选手人数:");
            scanf("%d",&b);

                //判断文件是否打开失败
                if((fp=fopen("Campus Singer Grand Prix scoring system.txt","wt+"))==NULL)
        {
                      printf("文件打开失败!\n");
                    exit(0);  //打开失败则退出程序
        }else{
                     printf("打开成功!\n");

                for(i=1;i<=b;i++)  //格式化输出
        {
            fprintf(fp,"num:%d\t\t",Singer[i].num);
              fprintf(fp,"name:%s\t\t",Singer[i].name);
            fprintf(fp,"sum(总分):%5.2f\t",Singer[i].sum);
                fprintf(fp,"result(最终成绩):%5.2f\t",Singer[i].result);
                   fprintf(fp,"sort:%d\n",Singer[i].sort);
        }

                    
        for(i=1;i<=b;i++)  //格式化输入
        {
                fscanf(fp,"%d",&Singer[i].num);
            fscanf(fp,"%s",Singer[i].name);
            fscanf(fp,"%f",&Singer[i].sum);
                fscanf(fp,"%f",&Singer[i].result);
            fscanf(fp,"%d",&Singer[i].sort);
        }

     

        printf("写入完成!\n");
    }

        fclose(fp);

                printf("写入完成!\n");
                printf("-------------------------------------\n");
                break;

            
            case 7:

                exit(0);


            default:
                
                printf("输入错误,请重试!\n");
        }
    }    

    fclose(fp);
    system("pause");
    
}
  • 在写入数据文件时,打开文件时使用了“wt+”模式,这会导致每次写入文件时都会清空文件内容,并从文件头开始写入,如果文件中已经有内容,就会出现末尾出现一堆“屯”的问题。

  • 你需要使用“at+”模式,它可以在文件末尾追加数据而不是覆盖原有数据。修改代码如下:

if((fp=fopen("Campus Singer Grand Prix scoring system.txt","at+"))==NULL)
{
    printf("文件打开失败!\n");
    exit(0);
}
else
{
    printf("打开成功!\n");
    for(i=1;i<=b;i++)
    {
        fprintf(fp,"num:%d\t\t",Singer[i].num);
        fprintf(fp,"name:%s\t\t",Singer[i].name);
        fprintf(fp,"sum(总分):%5.2f\t",Singer[i].sum);
        fprintf(fp,"result(最终成绩):%5.2f\t",Singer[i].result);
        fprintf(fp,"sort:%d\n",Singer[i].sort);
    }
}


小魔女参考了bing和GPT部分内容调写:
这个问题的原因可能是文件末尾没有添加换行符,导致fscanf函数无法正常读取文件,从而出现了一堆“屯”的情况。解决方法是在fopen函数之后,添加一句fseek函数,将文件指针移动到文件末尾,然后在文件末尾添加一个换行符,代码如下:

FILE *fp3;
fp=fopen(                                ,    );
fseek(fp, 0, SEEK_END);
fputc('\n', fp);

这样就可以解决文件末尾出现一堆“屯”的问题了。
回答不易,记得采纳呀。

你是按二进制方式写入的文件
写入的不全是字符串,还有int
那么你必须以二进制方式读取文件
而不能以txt方式打开
否则非字符串的数据也要转为字符方式显示,肯定是乱码呀