C语言读取文件:如何处理列数不一致的多行输入?
处理列数可变的文本行读取问题
针对你遇到的列数不同的文本行读取问题,核心解决思路是先读取每行的第一个功能号(funcNum),再根据功能号的不同,使用对应的格式读取该行剩余内容。
原代码失败原因
你用固定格式的fscanf(Instruction,"%d %d %s %d",...),但文件里的行元素数量不统一:
- 比如类型2的行(
2 Pasta 4)只有3个元素,第二个%d无法匹配,导致tableNum值异常,后续的字符串和数字也读取失败; - 类型5的行(
5 1)只有2个元素,后面的格式符完全无法匹配,变量值混乱。
可行解决方案代码示例
#include <stdio.h> #include <string.h> int main() { FILE *Instruction = fopen("Instruction.txt", "r"); if (!Instruction) { perror("Failed to open file"); return 1; } int first_num; // 读取第一行的单个数值 fscanf(Instruction, "%d", &first_num); printf("第一行数值:%d\n", first_num); int funcNum, tableNum, amount; char name[50]; int read_count; // 循环处理剩余行 while ((read_count = fscanf(Instruction, "%d", &funcNum)) == 1) { switch(funcNum) { case 2: // 格式:2 字符串 数字 fscanf(Instruction, "%s %d", name, &amount); printf("类型2:%d %s %d\n", funcNum, name, amount); break; case 3: case 4: // 格式:3/4 数字 字符串 数字 fscanf(Instruction, "%d %s %d", &tableNum, name, &amount); printf("类型%d:%d %d %s %d\n", funcNum, funcNum, tableNum, name, amount); break; case 5: // 格式:5 数字 fscanf(Instruction, "%d", &tableNum); printf("类型5:%d %d\n", funcNum, tableNum); break; default: // 处理未知类型,跳过该行剩余内容 char buf[100]; fgets(buf, sizeof(buf), Instruction); printf("未知类型:%d,跳过该行\n", funcNum); break; } } fclose(Instruction); return 0; }
关键细节说明
- 先读取每行的
funcNum,通过switch分支匹配对应格式,确保每行的元素数量和格式对应; fscanf会自动跳过换行符和空白字符,处理完一行后不会影响下一行读取;- 加入文件打开失败的错误处理,以及未知类型的跳过逻辑,避免程序崩溃;
- 字符串
name需分配足够空间,防止溢出。
内容的提问来源于stack exchange,提问作者Keanu
相关产品推荐
相关产品推荐

