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
相关产品推荐
相关产品推荐

