C语言读取TAB分隔整数文件异常:所有读取值返回0
解决C语言读取TAB分隔数据文件值全为0的问题
你的代码读取数据全为0,核心原因是第一行表头被当成整数读取导致fscanf失败,后续读取连锁出错,再加上格式串的小问题,以下是具体修复步骤:
必须跳过表头行:文件第一行是字符串表头
P C D,用%d格式读取会直接失败,fscanf返回0且读取位置不推进,导致所有数据都无法正确读入。可以用fgets跳过第一行:char buffer[256]; fgets(buffer, sizeof(buffer), file_ptr); // 跳过表头行移除格式串末尾的空格:你的格式串
"%d %d %d "末尾多了一个空格,这会让fscanf在读取完第三个整数后,持续跳过空白字符直到遇到非空白,在文件末尾时可能导致读取阻塞或异常。改成"%d %d %d"即可——%d本身会自动跳过所有空白(包括TAB、空格、换行),无需特意处理TAB分隔。检查
fscanf的返回值:每次读取后确认是否成功读取了3个整数,方便快速排查问题:int ret = fscanf(file_ptr, "%d %d %d", &system.tasks[i].p, &system.tasks[i].c, &system.tasks[i].d); if (ret != 3) { printf("第%d行读取失败,返回值:%d\n", i+1, ret); break; }确认
N_LINES的正确性:确保N_LINES的值等于文件中实际数据行的数量(不包含表头),如果N_LINES过大,超出文件实际行数,后续读取会失败,值保持初始化的0。验证文件路径:确认
system_file指向的文件路径正确,比如相对路径是否和程序运行目录匹配,也可以尝试用绝对路径测试。
修改后的完整代码示例:
FILE *file_ptr = fopen(system_file, "r"); if (file_ptr == NULL) { printf("no such file.\n"); return 0; } // 跳过表头行 char buffer[256]; if (fgets(buffer, sizeof(buffer), file_ptr) == NULL) { printf("文件为空或读取表头失败\n"); fclose(file_ptr); return 0; } for (int i = 0; i < N_LINES; i++){ int ret = fscanf(file_ptr, "%d %d %d", &system.tasks[i].p, &system.tasks[i].c, &system.tasks[i].d); if (ret != 3) { printf("读取第%d行数据失败,实际读取%d个值\n", i+1, ret); break; } } fclose(file_ptr); // 记得关闭文件,避免资源泄漏
如果需要明确指定仅用TAB分隔(比如防止数据字段内有空格的情况),可以改用%d\t%d\t%d格式串,注意行尾无TAB时,最后一个%d仍能正常读取,因为%d会忽略换行等空白。
内容的提问来源于stack exchange,提问作者aaaaaaaaaaaaaaa
相关产品推荐
相关产品推荐

