You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言仅复制源文件中第三列末尾为5的行到新文件

问题分析

你原来的代码存在几个明显问题:

  • 未声明fptr1、fptr2、c变量,存在编译错误
  • 逻辑拆分混乱,前面的fscanf读取了部分源文件内容,后续逐字符复制时指针已经偏移,会漏掉前面的内容
  • 没有按行筛选的判断逻辑

修改思路

我们可以逐行读取源文件内容,拆分出第三列后判断最后一位是否为'5',符合条件的行直接写入目标文件即可。

完整修改后代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    // 源文件指针统一命名为fptr1,避免混淆
    FILE* fptr1 = fopen("data.txt","r");
    char filename[100];
    char line_buf[200]; // 存储整行内容
    char col1[50], col2[50], col3[50]; // 存储三列内容

    if (fptr1 == NULL)
    {
        printf("no such file.");
        return 0;
    }

    printf("Create a file \n");
    scanf("%s", filename);
  
    FILE* fptr2 = fopen(filename, "w");
    if (fptr2 == NULL)
    {
        printf("Cannot open file %s \n", filename);
        fclose(fptr1);
        exit(0);
    }

    // 逐行读取源文件
    while (fgets(line_buf, sizeof(line_buf), fptr1) != NULL)
    {
        // 拆分三列,忽略换行符等空白字符
        if (sscanf(line_buf, "%s %s %s", col1, col2, col3) == 3)
        {
            int col3_len = strlen(col3);
            // 判断第三列最后一个字符是否为'5'
            if (col3_len > 0 && col3[col3_len - 1] == '5')
            {
                // 符合条件则写入整行到目标文件
                fputs(line_buf, fptr2);
            }
        }
    }
  
    printf("\nContents copied to %s", filename);
  
    fclose(fptr1);
    fclose(fptr2);
    return 0;
}

关键修改说明

  • 用fgets逐行读取源文件,保证每行内容完整保留
  • 用sscanf拆分每行的三列内容,不需要手动处理字符串拆分
  • 取第三列的最后一个字符判断是否等于'5',符合条件才写入目标文件
  • 补全了所有未声明的变量,修正了语法错误,增加了异常场景下的文件关闭处理

内容的提问来源于stack exchange,提问作者Regular User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:24:00