C语言读取txt文件时如何跳过行首T字符提取数值
问题说明
需要读取格式如下的txt文件,跳过每行开头的固定字符T,提取后续的三个数字存入对应变量,此前尝试用fscanf的%*c格式符跳过字符未生效。
输入文件内容:
T1, 3, 0 T2, 3, 1 T3, 2, 2
原有实现代码:
int initialize() { int n, n1, n2, n3, i = 0; FILE *fp; fp = fopen("input.txt", "r"); if (fp == NULL) { printf("Error locating the file. Please try again!\n"); exit(1); } while (fscanf(fp, "%d, %d, %d", &n1, &n2, &n3) != EOF) { p[i] = n1; if (p[i] > MAX) { printf("Woah! I am not a super computer. Please input upto 100 processes :)\n"); exit(1); } b[i] = n2; a[i] = n3; i++; } fclose(fp); return i; }
故障原因
原fscanf使用的格式串"%d, %d, %d"会从当前文件指针位置尝试匹配十进制整数,但每行第一个有效字符是字母T,不属于合法整数起始字符,匹配直接失败,循环无法正常读取数据。单独使用%*c未生效通常是没有处理行与行之间的换行空白符,或者格式串匹配顺序错误导致。
修复方法
直接在格式串最前端加入对固定前缀T的匹配,同时优化循环判断逻辑即可:
- 格式串开头加一个空格,自动跳过所有前置空白符(换行、空格、制表符),兼容不同换行格式的输入文件
- 空格后直接写字符
T,匹配每行开头的固定前缀,匹配成功后自动跳过该字符,再读取后续整数 - 将循环判断条件从
!= EOF改为== 3,只有成功读取到3个整数时才进入处理逻辑,避免匹配失败时脏数据写入数组
修复后的完整代码:
int initialize() { int n1, n2, n3, i = 0; FILE *fp; fp = fopen("input.txt", "r"); if (fp == NULL) { printf("Error locating the file. Please try again!\n"); exit(1); } while (fscanf(fp, " T%d, %d, %d", &n1, &n2, &n3) == 3) { p[i] = n1; if (p[i] > MAX) { printf("Woah! I am not a super computer. Please input upto 100 processes :)\n"); exit(1); } b[i] = n2; a[i] = n3; i++; } fclose(fp); return i; }
注:原代码中声明的变量n未被使用,已移除,避免产生无意义的编译警告。
内容的提问来源于stack exchange,提问作者Matheus Ciccotti
相关产品推荐
相关产品推荐

