使用open()、write()、sprintf()实现数组逆序写入文件的问题排查
C程序文件写入错误排查与修复
常见错误原因
- 文件打开模式不正确:未添加
O_CREAT | O_TRUNC标志,要么文件不存在时无法创建,要么保留旧文件内容导致输出混乱;权限设置错误也会导致写入失败。 - write调用的长度参数错误:硬编码写入长度,而非使用
sprintf的返回值(实际生成的字符数),导致只写入部分内容。 - 缓冲区逻辑漏洞:循环中未正确重置缓冲区,残留旧数据,或者仅写入了最后一次生成的内容。
修复后的完整代码
#include <fcntl.h> #include <unistd.h> int main() { int arr[10]; char buf[32]; int fd; int i; int read_len; // 读取10个输入元素(终端输入逻辑) for (i = 0; i < 10; i++) { read_len = read(0, buf, sizeof(buf) - 1); buf[read_len] = '\0'; // 确保字符串结束 sscanf(buf, "%d", &arr[i]); } // 打开输出文件:创建/清空、只写模式,设置常规权限 fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd == -1) { sprintf(buf, "文件打开失败\n"); write(1, buf, 12); return 1; } // 输出标题到终端和文件 int title_len = sprintf(buf, "逆序输出结果:\n"); write(1, buf, title_len); write(fd, buf, title_len); // 逆序遍历数组,逐个写入 for (i = 9; i >= 0; i--) { int str_len = sprintf(buf, "%d ", arr[i]); // 同步写入终端和文件 write(1, buf, str_len); write(fd, buf, str_len); } // 写入换行符 write(1, "\n", 1); write(fd, "\n", 1); close(fd); return 0; }
关键修复说明
文件打开参数修正:
O_WRONLY:仅写模式O_CREAT:文件不存在时自动创建O_TRUNC:文件存在时清空原有内容0644:设置文件权限为所有者读写、其他用户只读,避免权限问题
精确控制写入长度:
利用sprintf的返回值(实际生成的字符数)作为write的第三个参数,确保每次都写入完整的字符串,避免因硬编码长度导致的部分内容写入。同步终端与文件写入逻辑:
终端(文件描述符1)和输出文件使用完全相同的缓冲区生成与写入逻辑,保证两者输出内容一致。缓冲区安全处理:
输入时手动添加字符串结束符,避免sscanf读取错误;循环中每次重新生成缓冲区内容,防止旧数据残留。
内容的提问来源于stack exchange,提问作者stackunderflow3
相关产品推荐
相关产品推荐

