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

Linux C语言使用fgets()读取终端输入写入文件及end退出实现问题

实现方案

以下是修改后可满足需求的完整代码:

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

int main(int argc, char* argv[]) {
    char buff[512];
    int desc;
    int lb;

    // 校验输入参数合法性
    if (argc < 2) {
        printf("使用方式:%s 目标文件路径\n", argv[0]);
        exit(1);
    }

    // 打开目标文件:不存在则自动创建,已存在则清空原有内容,权限设为644
    // 如果需要追加内容而非覆盖,可将O_TRUNC替换为O_APPEND
    desc = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if(desc == -1) {
        perror("打开文件失败");
        exit(1);
    }

    while(fgets(buff, 512, stdin) != NULL) {
        // 移除fgets读取到的末尾换行符
        buff[strcspn(buff, "\n")] = '\0';
        // 匹配到end则终止循环
        if (strcmp(buff, "end") == 0) {
            break;
        }
        // 恢复换行符,保证写入文件的格式和输入一致
        strcat(buff, "\n");
        lb = strlen(buff);
        write(desc, buff, lb);
    }

    close(desc);
    return 0;
}

关键修改说明

  • 补全缺失的依赖头文件:原代码使用的open/write系统调用、exit函数、strcmp等字符串处理函数分别需要引入<fcntl.h>、<unistd.h>、<stdlib.h>、<string.h>,同时移除了C++专属的<cstdio>头文件适配C语言编译环境。
  • 修复原代码的优先级bug:原循环条件lb=fgets(buff,512,stdin) > 0存在运算符优先级错误,实际会将比较的布尔值赋值给lb,而非读取到的内容长度,已修正为正确的读取判断逻辑。
  • 新增end终止逻辑:利用strcspn移除fgets读取内容末尾自带的换行符后,和end字符串做匹配,匹配成功则直接跳出循环终止程序。
  • 新增参数校验逻辑:避免用户未传入目标文件路径时程序异常崩溃。
  • 优化文件打开逻辑:新增文件不存在时自动创建的配置,适配更多使用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 00:45:04