C语言读取txt文件仅首次循环正常后续读取失败问题求解
问题原因
你的代码存在以下几处核心错误,直接导致运行异常:
- 读取数据的循环次数错误
你当前写的读取循环是for(int i=0;i<1;i++),仅执行1次,只会存储第一组数据,第二组数据完全没有被读取。后续输出时循环次数是从文件读取的n=2,输出第二组数据时读取的是数组未初始化的垃圾值,自然结果错误。 - 带空格的字段读取逻辑错误
你使用%s读取专业全称name字段,而%s默认遇到空格就会终止读取。你的txt文件中第二组的专业全称是Search Engine,中间带有空格,用%s只会读取到Search,剩余的Engine会被误当成后续的numb字段解析,直接导致后续所有字段读取错位。 - 语法不规范问题
- 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
相关产品推荐
相关产品推荐

