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

C语言文件IO与缓冲区操作无输出问题的技术咨询

代码问题排查与修复

你的代码无法完成预期操作,主要有以下几个问题:

  • write写入长度错误:write(fd, "it works\n", 300); 第三个参数指定写入300字节,但"it works\n"实际只有9个有效字符(包含换行符),这样会写入字符串之后的垃圾内存数据,属于未定义行为。应该使用字符串实际长度,比如strlen("it works\n")或者直接写9。

  • 文件偏移指针未重置:调用write后,文件的读写指针会停在写入内容的末尾,此时直接调用read会从文件末尾开始读,自然读不到任何内容。需要在read之前用lseek(fd, 0, SEEK_SET)将指针移回文件开头。

  • 未检查系统调用返回值:open、malloc、write、read这些系统调用都可能执行失败(比如文件权限不足、内存分配失败),不检查返回值会导致后续错误操作,比如open失败返回-1,后续的write/read都会无效。

  • malloc分配的内存未初始化:malloc分配的内存是未初始化的垃圾值,如果读取失败,后续写入控制台和text2的就是这些垃圾数据,建议用memset初始化缓冲区。

修复后的代码示例:

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

int main()
{
    int fd, fz;
    char *buff;
    const char *msg = "it works\n";
    ssize_t write_len, read_len;

    // 打开文件并检查返回值
    fd = open("./text", O_CREAT | O_APPEND | O_RDWR, 0644);
    if (fd == -1) {
        perror("open text failed");
        return 1;
    }

    fz = open("./text2", O_CREAT | O_APPEND | O_RDWR, 0644);
    if (fz == -1) {
        perror("open text2 failed");
        close(fd);
        return 1;
    }

    // 分配内存并初始化
    buff = malloc(sizeof(char) * 300);
    if (!buff) {
        perror("malloc failed");
        close(fd);
        close(fz);
        return 1;
    }
    memset(buff, 0, 300);

    // 写入正确长度的内容
    write_len = write(fd, msg, strlen(msg));
    if (write_len == -1) {
        perror("write to text failed");
        free(buff);
        close(fd);
        close(fz);
        return 1;
    }

    // 重置文件指针到开头
    if (lseek(fd, 0, SEEK_SET) == -1) {
        perror("lseek failed");
        free(buff);
        close(fd);
        close(fz);
        return 1;
    }

    // 读取内容并检查长度
    read_len = read(fd, buff, 300);
    if (read_len == -1) {
        perror("read from text failed");
        free(buff);
        close(fd);
        close(fz);
        return 1;
    }

    // 输出到控制台和text2
    write(STDOUT_FILENO, buff, read_len);
    write(fz, buff, read_len);

    // 释放资源
    free(buff);
    close(fd);
    close(fz);

    return 0;
}

内容的提问来源于stack exchange,提问作者Oyeniran Samuel Sanmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:13:10