「已注销」 2023-01-03 11:34 采纳率: 50%
浏览 31
已结题

链表中数据输入文本文件数据不能左对齐?

问题遇到的现象和发生背景

把链表中的数据输入到文件中,用%-20s的类似形式,exe显示都是对齐的,但是文本文件(即记事本)中数据对不齐
细节:当专业和姓名出现字数不同时,字数越多,偏移越大

遇到的现象和发生背景,请写出第一个错误信息

我想知道如何让文本文件数据左对齐?出错原因?

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
//1. 录入并保存信息:把学生信息保存到文件 stu.txt 中,输入学生基本信息、课外表现分和各科成绩信息;
struct Student * enter(struct Student *head)
{
    int i=1;//i代表序号 
    struct Student *p1=NULL,*p2=NULL; 
    FILE *fp= fopen("./stu.txt","w+");//打开文件 
    if(fp == NULL)
    {
        printf("wu fa da kai wen jian,qing chong xin shi yong");
        return 0;
    }
    fprintf(fp,"ji dian guan li xi tong\n");
    fprintf(fp,"      zuangye  banji        xingmin         gaoshu   yingyu        yuwen     xueye       kewai           jididan\n");//学业总成绩拼音太长,取了前两个字拼音 

    //对文件的操作                                    
    
    printf("*************  1. lu yong bing bao cun xin xi       **********\n");
    printf("qing shu ru zuangye banji xingmin gaoshu yingyu yuwen  kewai \n");
    printf("xu yao jie shu qing zai zuangye wei shu ru (jieshu) jie shu \n");
    printf("ju li:wangluo(han zi ban) 22-1 ZhangSan(han zi ban) 100 33 90 90\n");
    printf("zuangye banji xingmin gaoshu yingyu yuwen kewai\n");//使用说明
    
    head = p1 = NULL;
    head=p1=p2=(struct Student *)malloc(sizeof(struct Student));
    head = p1;
    
    while(1)
    {
        printf("xiang tui chu,qing shu ru(jieshu)\n");
        scanf("%s",p1->zuang);
        if(strcmp(p1->zuang,"jieshu")==0)//专业填写jieshu退出 
        {
            p2->next=p1;
            
            p1=NULL;
            
            break;
        }
        scanf("%s%s%f%f%f%f", p1->ban, p1->xing, &p1->gaoshu, &p1->yingyu, &p1->yuwen, &p1->kewai);//scanf不能决定精度 

        if(p1->gaoshu < 0 && p1->yingyu < 0 && p1->yuwen < 0 && p1->kewai < 0 && p1->gaoshu > 100 && p1->yingyu > 100 && p1->yuwen > 100 && p1->kewai > 100)//成绩输入错误提醒 
        {
            printf("shu ru cheng ji chu cuo,cheng ji ying zai 0~100 de fan wei,gai ren xin xi bu lu yong,qing zai ci tian xie"); 
        }
        else//成绩输入正确才到下一节点 
        {
            p2->xueye = p2->gaoshu + p2->yingyu + p2->yuwen;
            p2->jidian = 0.7*p2->xueye + 0.3*p2->kewai;
            fprintf(fp,"%-6d%-27s%-9s%-15s%-9.1f%-9.1f%-9.1f%-9.1f%-9.1f%-9.1f\n",i,p2->zuang, p2->ban, p2->xing, p2->gaoshu, p2->yingyu, p2->yuwen, p2->xueye, p2->kewai, p2->jidian);
            fflush(fp);//计算完存储数据保存在stu.txt 
            p1=(struct Student *)malloc(sizeof(struct Student));
            p2->next=p1;
            p2=p1;
            i++;
        }
        
    }
    p2->next = NULL;//指向空 

    fclose(fp);
    fp=NULL;//关闭文件指针

    return head;
}
//3. 读取stu.txt文件的全部学生信息并显示     :打开 stu.txt 文件,创建新链表存储文件数据并输出 
int show()//与学生系统的个人成绩查询一样的方法   //要stu.txt里面有数据 
{
    int i,g=0;
    char a[100];//用于接受文件中的第一行文字    fprintf(fp,"ji dian guan li xi tong \n"); 
    char b[100];//用于接受文件中的第二行文字,即学生各方面信息 
    struct Student *p2=NULL,*p1=NULL,*p3=NULL,*head=NULL;

    FILE *fp;

    printf("*************  3. xian shi bing du qu quan xue sheng xin xi  *********\n");
    
    fp = fopen("./stu.txt","r+");//打开文件
    if(fp == NULL)
    {
        printf("wu fa da kai wen jian,qing chong xin shi yong\n");
        return 0;
    }
    
    i=1;
    fgets(a,100,fp);
    puts(a);
    fgets(b,100,fp);
    puts(b);
    
    p1=p2=(struct Student *)malloc(sizeof(struct Student));
    p3=(struct Student *)malloc(sizeof(struct Student));
    head=p1;
    while(1)
    {
        fscanf(fp,"%d%s%s%s%f%f%f%f%f%f\n",&i,p2->zuang, p2->ban, p2->xing, &p2->gaoshu, &p2->yingyu, &p2->yuwen, &p2->xueye, &p2->kewai, &p2->jidian);
        if(g==i)//利用循环时到想打印的都打完,最后序号i与序号i相等且为固定值,其他为乱码    //原理不知 
        break;
        printf("%-6d%-27s%-9s%-15s%-9.1f%-9.1f%-9.1f%-9.1f%-9.1f%-9.1f\n",i,p2->zuang, p2->ban, p2->xing, p2->gaoshu, p2->yingyu, p2->yuwen, p2->xueye, p2->kewai, p2->jidian);
        //数据从stu.txt输出到链表
        p1=(struct Student *)malloc(sizeof(struct Student));

        p2->next=p1;
        p3=p2;
        p2=p1;
        g=i;
    }
    p3->next=NULL;
    p1 =p2= NULL;
    p2=head;

    fclose(fp);
    fp = NULL;//关闭文件指针    
                                         
    getchar();
    getchar();
    return 0;
}
运行结果及详细报错内容

img

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

我尝试解决,以为是文本文件与程序运行的exe对应一个字的空格多少不同,但尝试失败

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

谢谢回答,应要求,使用说明用的是拼音,不容易理解,请多见谅。

  • 写回答

1条回答 默认 最新

  • 於黾 2023-01-03 11:40
    关注

    要么别用中文,用中文的话你就要判断中文几个字,根据字数设置空格数量
    因为中文也是一个汉字占一个字符,IDE只管里面有几个字符,不管里面一共占几个字节
    此外,不同字体占的宽度也不同,用txt做对齐就是会比较坑,要不然还是多用\t少用空格来占位,或者干脆csv文件

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月11日
  • 已采纳回答 1月3日
  • 创建了问题 1月3日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题