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

C语言创建文件后读取失败求助:写入后无法读取内容

问题分析与解决建议

你的代码存在两个核心问题,直接导致读取操作失败:

1. 文件打开模式错误

creat() 函数创建文件时,是以只写模式(O_WRONLY | O_CREAT | O_TRUNC)打开的,此时文件描述符不支持读取操作,调用read()会直接失败,返回值n为-1。

2. 读取缓冲区未正确初始化

char* c是一个未初始化的指针,没有指向任何有效内存空间。你调用read(fd, &c, 4)时,实际是把读取内容写入了指针变量c本身的内存地址,属于非法内存访问,会触发未定义行为。


修正后的代码示例

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

int main(){
    int fd, n;
    // 用栈上数组作为读取缓冲区,预留字符串结束符位置
    char c[5];
    // 用open()指定可读可写模式,同时实现创建/截断文件功能
    fd = open("as.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);
    if (fd == -1) {
        perror("open failed");
        exit(EXIT_FAILURE);
    }
    write(fd, "hola", 4);
    // 将文件指针移到文件开头
    lseek(fd, 0, SEEK_SET);
    n = read(fd, c, 4);
    if (n == -1) {
        perror("read failed");
        close(fd);
        exit(EXIT_FAILURE);
    }
    // 添加字符串结束符,避免打印乱码
    c[n] = '\0';
    printf("Read: %d, Content: %s\n", n, c);
    close(fd); // 关闭文件描述符,避免资源泄漏
    return 0;
}

关键修正说明

  • 替换creat()为open(),指定O_RDWR模式,让文件同时支持读写操作。
  • 使用栈上字符数组char c[5]作为缓冲区,或用malloc()动态分配内存,确保有合法存储空间存放读取内容。
  • 增加open()、read()的错误检查,便于快速定位问题。
  • 读取后添加'\0'字符串结束符,保证打印内容的正确性。
  • 操作完成后调用close()关闭文件描述符,避免系统资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:26:28