使用fscanf读取文件内容到动态数组时得到随机值问题求助
问题原因
- 缓冲区类型错误:
fgets()要求输入缓冲区为char类型数组,你的代码中定义int line[100],类型不匹配会导致读取到的内容内存解释异常,直接产生乱值。 - 输入函数混用逻辑错误:
fgets()已经从文件指针veri中读取走了一行内容,后续的fscanf()会继续读取下一行内容,最终会跳过所有奇数行,且读取到文件末尾时fscanf()执行失败,不会给对应数组元素赋值,保留malloc申请内存后的初始随机值。 - 缺少必要校验:未校验
malloc是否分配成功、buffer大小是否大于等于文件总行数(你提供的样例文件共51行,buffer需要至少等于51)、fscanf是否成功读取到4个整数,异常场景下都会产生无效值。
修复代码
你可以选择去掉fgets直接用fscanf循环读取,逻辑更简单:
int* aaNo; int* bbKod; int* ccPuan; int* ddOffset; // 确认buffer的值>=51,避免数组越界 aaNo = (int*)malloc(buffer * sizeof(int)); bbKod = (int*)malloc(buffer * sizeof(int)); ccPuan = (int*)malloc(buffer * sizeof(int)); ddOffset = (int*)malloc(buffer * sizeof(int)); // 增加内存分配校验 if (!aaNo || !bbKod || !ccPuan || !ddOffset) { printf("内存分配失败\n"); // 这里可以加已分配内存的释放逻辑,再退出 return -1; } int o = 0; // 直接用fscanf循环读取,返回值等于4说明成功读到4个整数 while (fscanf(veri, "%d %d %d %d", &aaNo[o], &bbKod[o], &ccPuan[o], &ddOffset[o]) == 4) { // 增加数组越界校验 if (++o >= buffer) { printf("数组容量不足\n"); break; } }
如果你需要逐行读取做额外校验,也可以用fgets搭配sscanf的写法:
// 缓冲区改为char类型 char line[100]; int o = 0; while (fgets(line, sizeof(line), veri) && o < buffer) { if (sscanf(line, "%d %d %d %d", &aaNo[o], &bbKod[o], &ccPuan[o], &ddOffset[o]) == 4) { o++; } }
内容的提问来源于stack exchange,提问作者Berk Sunduri
相关产品推荐
相关产品推荐

