C语言调用open、write函数写入文件后文件为空如何解决
问题解决方案
核心错误原因
- 未校验系统调用的返回值
open、write、close都属于系统调用,执行过程中可能因为权限不足、资源限制等原因失败,返回值为-1。当前代码没有做错误判断,无法定位具体失败环节,添加perror可以直接打印错误信息定位具体原因。 write写入长度错误
传入的sizeof(buf)是整个数组的长度1024字节,但实际只初始化了数组前10个字节(对应"My message"的长度,包含字符串结束符),剩下的1014字节都是栈上未初始化的垃圾数据,会导致写入大量无效内容,甚至出现有效内容被隐藏的情况。正确的写入长度应该是strlen(buf)(不需要写入字符串结束符时)或者strlen(buf)+1(需要保留结束符时)。open标志位缺失
当前只设置了O_CREAT | O_WRONLY,缺少O_TRUNC标志:如果目标文件已经存在,现有内容不会被清空,写入操作会从文件开头覆盖写入,若旧文件长度大于本次写入长度,旧文件末尾的内容会残留。添加O_TRUNC可以保证每次写入都是全新内容。
修正后代码
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main() { char buf[1024]; // 打开文件,添加O_TRUNC标志清空原有内容 int file = open("testfile.txt", O_CREAT | O_WRONLY | O_TRUNC, 0644); if (file == -1) { perror("open文件失败"); return 1; } strcpy(buf, "My message"); // 写入实际有效内容长度 ssize_t write_len = write(file, buf, strlen(buf)); if (write_len == -1) { perror("write写入失败"); close(file); return 1; } int close_ret = close(file); if (close_ret == -1) { perror("close关闭失败"); return 1; } return 0; }
额外排查建议
如果修改后依然存在文件为空的情况,可按照以下步骤排查:
- 确认程序运行的工作目录和你查看的
testfile.txt所在目录一致,部分IDE运行程序时会默认将工作目录设置为项目根目录,而非可执行文件所在目录 - 检查运行程序的用户对目标目录是否有写入权限,对已存在的
testfile.txt是否有修改权限
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

