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

C语言:写入文件后读取内容,printf无输出问题求助

问题

使用fprintf向文件写入内容后,打开文件读取内容到缓冲区,通过printf输出到标准输出时却看不到任何内容,相关代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main()
{
    uint8_t *my_buffer = malloc(64UL);

    FILE *fp1 = fopen("my_buffer_file", "w");
    fprintf(fp1, "0123456789012345678901234567890123456789012345678901234567890123");
    FILE *my_buffer_fd = fopen("my_buffer_file", "r" );
    int my_new_ret = fread(my_buffer, 1, 64UL, my_buffer_fd);
    int size = my_new_ret;
    printf("my_buffer = |%s|\n", my_buffer);
    printf("size = |%d|\n", size);


    return 0;
}

原因与解决办法

出现这个问题主要有三个核心原因:

  • 写入数据未同步到磁盘:fopen("w")打开文件后,fprintf写入的内容会暂存在标准IO的用户态缓冲区中,未主动刷新或关闭文件时,数据不会立即写入磁盘。此时以读模式打开同一文件,自然读不到内容。
  • 缺少字符串终止符:fread读取的是原始字节数据,不会自动添加\0,而printf的%s格式要求字符串必须以\0结尾,否则会触发未定义行为,即便读到内容也无法正常显示。
  • 堆内存未初始化:malloc分配的内存未做初始化,内部存在随机脏数据,会干扰后续字符串处理。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main()
{
    // 用calloc分配内存并初始化为0,避免脏数据干扰
    uint8_t *my_buffer = calloc(64UL, 1);
    if (my_buffer == NULL) {
        perror("calloc failed");
        return 1;
    }

    FILE *fp1 = fopen("my_buffer_file", "w");
    if (fp1 == NULL) {
        perror("fopen write failed");
        free(my_buffer);
        return 1;
    }
    fprintf(fp1, "0123456789012345678901234567890123456789012345678901234567890123");
    // 关闭文件强制将缓冲区数据同步到磁盘,也可用fflush(fp1)替代
    fclose(fp1);

    FILE *my_buffer_fd = fopen("my_buffer_file", "r");
    if (my_buffer_fd == NULL) {
        perror("fopen read failed");
        free(my_buffer);
        return 1;
    }
    // 预留1字节给终止符,避免内存越界
    int my_new_ret = fread(my_buffer, 1, 63UL, my_buffer_fd);
    // 手动添加字符串终止符,保证%s正常解析
    my_buffer[my_new_ret] = '\0';
    int size = my_new_ret;
    printf("my_buffer = |%s|\n", my_buffer);
    printf("size = |%d|\n", size);

    fclose(my_buffer_fd);
    free(my_buffer);

    return 0;
}

关键修复点

  • 替换malloc为calloc,初始化内存为0,消除脏数据影响。
  • 写入完成后调用fclose(fp1)或fflush(fp1),确保缓冲区数据写入磁盘。
  • 读取时预留1字节空间,手动添加\0终止符,适配printf的%s格式要求。
  • 添加文件打开失败的错误处理,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:20:45