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
相关产品推荐
相关产品推荐

