You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言读取txt学生数据时循环仅运行1次就报错如何解决

问题原因排查

核心错误点

  • 读取循环范围写错:你第二个程序里读取数据的for循环条件写的是i<1,意味着不管文件里存了多少条数据,最多只会读1条。但后面输出的循环是跑满n次的,当n>1时,后面未读取的数组元素都是内存垃圾值,输出时就会触发异常。
  • %s无法读取带空格的字符串:你第一个程序写入名字用的是fgets,支持录入带空格的专业名,但读取时用fscanf的%s格式符,碰到空格就会停止读取,会直接导致后续字段读取错位,数据全部乱码。
  • 参数传递不规范:fscanf(f," %s ",&dnu[i].id)这里不需要加&,dnu[i].id本身就是字符数组首地址,直接传即可。

修复后的读取代码示例

#include"stdio.h"
#include"stdlib.h"
#include"string.h"

struct age{
    char id[10];
    char name[50];
    int numb;
    int score;
};

// 复用删除换行的工具函数
void delete_n(char a[]){
    size_t x=strlen(a);
        if(a[strlen(a)-1]=='\n'){
            a[strlen(a)-1]='\0';
        }
}

int main(){
    struct age dnu[20];
    int n;
    FILE *f;
    f = fopen("ex3","r");
    if(f==NULL){
        printf("Error");
        exit(0);
    }
    
    fscanf(f,"%d",&n);
    // 吃掉fscanf读完n之后残留的换行符
    getc(f);
    // 循环次数改成n,读取所有数据
    for(int i=0;i<n;i++){
        // 用fgets读取带空格的id和name,和写入逻辑对应
        fgets(dnu[i].id,sizeof(dnu[i].id),f);
        delete_n(dnu[i].id);
        fgets(dnu[i].name,sizeof(dnu[i].name),f);
        delete_n(dnu[i].name);
        fscanf(f,"%d",&dnu[i].numb);
        fscanf(f,"%d",&dnu[i].score);
        // 吃掉读完数字后的换行符
        getc(f);
        getc(f);
    }
    printf("%10s    %20s    %20s    %20s","Ma nganh","Ten nganh","So sinh vien ","Diem trung tuyen\n");
    for(int i=0;i<n;i++){
        printf("%10s    %20s    %20d    %20d",dnu[i].id,dnu[i].name,dnu[i].numb,dnu[i].score);
        printf("\n");
    }
    fclose(f);
    return 0;
}

额外优化建议

如果需要符合要求存为.txt格式,把第一个程序里fopen("ex3","w")改成fopen("ex3.txt","w"),读取程序的路径也对应修改即可。

内容的提问来源于stack exchange,提问作者Ngoc Anh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:36:03