C语言如何直接读取含无关文本的txt文件并跳过无效行提取数值
结论
完全可以直接读取orig_data.txt,不需要提前手动剔除无用文本,只需要在读取逻辑中增加跳过指定无用行的步骤即可,下面是两种可直接使用的实现方案:
方案1:用fgets跳过整行(兼容性最好)
这种方案不依赖无用行的文本内容,只要文件格式固定、无用行的位置固定即可正常运行,修改后的代码如下:
void readdata() { FILE* fp = fopen("orig_data.txt", "r"); if (fp == NULL) { // 可自行补充文件打开失败的处理逻辑 return; } char buf[1024]; // 跳过第一行无用文本 fgets(buf, sizeof(buf), fp); // 读取第二行的客户总数 int no_cust; fscanf(fp, "%d", &no_cust); // 连续调用两次fgets:第一次吃掉读取no_cust后残留的换行符,第二次跳过第三行表头 fgets(buf, sizeof(buf), fp); fgets(buf, sizeof(buf), fp); int* ids = new int[no_cust+1]; int* ssns = new int[no_cust+1]; for(int i = 1; i <= no_cust; i++) { fscanf(fp, "%d %d", &ids[i], &ssns[i]); } // 其他业务逻辑 // 注意:数组使用完毕后需要执行 delete[] ids; delete[] ssns; 释放内存 fclose(fp); }
方案2:用fscanf忽略匹配内容(代码更简洁)
利用fscanf格式符中的*修饰符,可以匹配对应内容但不存储到变量,实现直接跳过无用内容的效果,代码如下:
void readdata() { FILE* fp = fopen("orig_data.txt", "r"); if (fp == NULL) { return; } int no_cust; // %*[^\n] 匹配第一行所有非换行字符且不存储,之后直接读取第二行的客户总数 fscanf(fp, "%*[^\n]%d", &no_cust); // 跳过第三行整行表头内容 fscanf(fp, "%*[^\n]"); int* ids = new int[no_cust+1]; int* ssns = new int[no_cust+1]; for(int i = 1; i <= no_cust; i++) { fscanf(fp, "%d %d", &ids[i], &ssns[i]); } // 其他业务逻辑 fclose(fp); }
注意事项
- 以上两种方案都依赖「文件格式统一,仅客户总数值不同」的前提,只要无用行的位置不发生变化就可以稳定运行
- 实际使用时建议增加
fscanf读取失败的判断逻辑,应对文件损坏的异常场景
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

