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
相关产品推荐
相关产品推荐

