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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:15:06