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

C语言读取txt文件仅首次循环正常后续读取失败问题求解

问题原因

你的代码存在以下几处核心错误,直接导致运行异常:

  1. 读取数据的循环次数错误
    你当前写的读取循环是for(int i=0;i<1;i++),仅执行1次,只会存储第一组数据,第二组数据完全没有被读取。后续输出时循环次数是从文件读取的n=2,输出第二组数据时读取的是数组未初始化的垃圾值,自然结果错误。
  2. 带空格的字段读取逻辑错误
    你使用%s读取专业全称name字段,而%s默认遇到空格就会终止读取。你的txt文件中第二组的专业全称是Search Engine,中间带有空格,用%s只会读取到Search,剩余的Engine会被误当成后续的numb字段解析,直接导致后续所有字段读取错位。
  3. 语法不规范问题
  • C语言使用自定义结构体时需要加struct关键字,你写的age dnu[20]不符合C标准,应当改为struct age dnu[20]
  • fscanf读取字符串时,数组名本身就是首地址,不需要额外加取地址符&,&dnu[i].id应改为dnu[i].id,&dnu[i].name同理。

修正后代码

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

struct age{
    char id[10];
    char name[50];
    int numb;
    int score;
};
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);  
    // 循环次数改为n次读取所有数据
    for(int i=0;i<n;i++){
        fscanf(f," %s",dnu[i].id);
        // 用%[^\n]读取带空格的整行内容作为name
        fscanf(f," %[^\n]",dnu[i].name);
        fscanf(f,"%d",&dnu[i].numb);
        fscanf(f,"%d",&dnu[i].score);
    }
    printf("%10s    %20s    %20s    %20s\n","majors","Name majors","number of students ","matriculation score");
    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;
}

内容的提问来源于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 10:54:04