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

基于Linux内核函数的C程序修正:读取文件最长字符串写入另一文件

修正后的文件处理程序(读取指定文件、找出最长字符串并写入目标文件)

我帮你把代码完全修正好了,现在它可以从你指定的输入文件读取内容,找出其中长度最长的字符串,然后写入到你指定的目标文件里,完美解决了你提到的两个问题。下面是完整的实现代码:

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

#define BUFFER_SIZE 1024

int main(int argc, char *argv[]) {
    // 检查命令行参数是否符合要求
    if (argc != 3) {
        write(STDERR_FILENO, "Usage: ./longest_str <input_file> <output_file>\n", 47);
        exit(EXIT_FAILURE);
    }

    // 打开输入文件(只读模式)
    int input_fd = open(argv[1], O_RDONLY);
    if (input_fd == -1) {
        perror("Failed to open input file");
        exit(EXIT_FAILURE);
    }

    // 打开输出文件(写入+创建+截断模式,权限设置为0644)
    int output_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (output_fd == -1) {
        perror("Failed to open output file");
        close(input_fd);
        exit(EXIT_FAILURE);
    }

    char buffer[BUFFER_SIZE];
    ssize_t bytes_read;
    char current_str[BUFFER_SIZE] = {0};
    char longest_str[BUFFER_SIZE] = {0};
    size_t current_len = 0;
    size_t longest_len = 0;

    // 循环读取输入文件内容
    while ((bytes_read = read(input_fd, buffer, BUFFER_SIZE - 1)) > 0) {
        buffer[bytes_read] = '\0'; // 确保缓冲区是合法的C字符串
        char *ptr = buffer;
        char *newline;

        // 分割缓冲区中的每一行字符串
        while ((newline = strchr(ptr, '\n')) != NULL) {
            *newline = '\0'; // 将换行符替换为字符串结束符
            strncpy(current_str, ptr, BUFFER_SIZE - 1);
            current_len = strlen(current_str);

            // 更新最长字符串记录
            if (current_len > longest_len) {
                longest_len = current_len;
                strncpy(longest_str, current_str, BUFFER_SIZE - 1);
            }

            ptr = newline + 1; // 移动指针到下一行起始位置
        }

        // 处理缓冲区中剩余的不完整行(比如文件末尾没有换行的情况)
        if (*ptr != '\0') {
            strncat(current_str, ptr, BUFFER_SIZE - current_len - 1);
            current_len = strlen(current_str);
        }
    }

    // 检查最后一行是否是最长的(如果文件不以换行结尾)
    if (current_len > longest_len) {
        longest_len = current_len;
        strncpy(longest_str, current_str, BUFFER_SIZE - 1);
    }

    // 将最长字符串写入输出文件,加上换行符保证格式统一
    if (longest_len > 0) {
        strcat(longest_str, "\n");
        write(output_fd, longest_str, longest_len + 1);
    }

    // 关闭文件描述符,避免资源泄漏
    close(input_fd);
    close(output_fd);

    return EXIT_SUCCESS;
}

关键改动说明

  • 命令行参数接收文件路径:
    现在程序通过命令行参数argv[1]和argv[2]获取输入、输出文件的路径,启动时需要先用gcc longest_str.c -o longest_str编译,然后执行./longest_str your_input.txt your_output.txt,彻底替代了从标准输入读取、向标准输出打印的逻辑。

  • 使用Linux内核系统调用处理文件:
    用open()系统调用打开指定文件,输入文件用O_RDONLY只读模式,输出文件用O_WRONLY | O_CREAT | O_TRUNC模式(如果文件不存在就创建,存在就清空内容),并设置合理的文件权限0644;操作完成后用close()关闭文件描述符,确保资源被正确释放。

  • 逐行处理并追踪最长字符串:
    读取文件内容到缓冲区后,用strchr()分割每行,实时比较每行的长度并更新最长字符串的记录;同时处理了缓冲区中不完整的行(比如文件最后一行没有换行的情况),避免遗漏数据。

  • 结果写入目标文件:
    最后用write()系统调用把最长字符串(加上换行符保证格式)写入到你指定的输出文件,而不是打印到终端。

  • 完善的错误处理:
    每个系统调用(open、read、write)都做了错误检查,用perror()输出清晰的错误信息,方便你调试排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:35:44