使用C语言创建文件并读写:代码运行未达预期问题排查
问题根源分析
你的代码核心问题出在文件读写位置指针的位置上:
- 用
fprintf向文件写入内容后,文件流的读写指针会自动移动到写入内容的末尾。此时直接调用fread,会从这个末尾位置开始读取,自然读不到任何数据。 - 另外,标准I/O流带有缓冲机制,
fprintf写入的内容可能还在用户态缓冲区中,没有同步到磁盘,但w+模式下,后续的位置移动操作会自动触发缓冲区刷新,不过手动刷新更稳妥。
修复方案
有两种简单的修复方式,推荐第一种:
方式1:移动文件指针到开头
在fprintf之后、fread之前,调用fseek将读写指针移回文件起始位置:
fprintf(fptr, "Hello, World!"); // Write to fptr // 新增:将文件指针移到文件开头 fseek(fptr, 0, SEEK_SET); // 可选:手动刷新缓冲区,确保写入内容同步到磁盘(w+模式下fseek会自动触发,但显式调用更清晰) fflush(fptr); fread(buffer, sizeof(buffer), 1, fptr); // Read immediately afterwards
另外,你的fread参数写法可以优化:当前是请求读取1块大小为sizeof(buffer)的数据,更合理的写法是读取最多SIZE个字节(每个字节大小为1),这样能准确获取实际读取的字符数:
size_t read_bytes = fread(buffer, 1, SIZE, fptr); buffer[read_bytes] = '\0'; // 确保字符串终止(不过你已经提前设了buffer[SIZE]='\0',这一步可备选)
方式2:关闭文件后重新打开读取
如果觉得移动指针不够直观,也可以写完后关闭文件,再以读模式重新打开:
fprintf(fptr, "Hello, World!"); fclose(fptr); // 重新以读模式打开 fptr = fopen("mem.txt", "r"); if (!fptr) { printf("Failed to open file for reading"); return -1; } fread(buffer, 1, SIZE, fptr);
修复后的完整代码示例
// This code is purely for testing and practicing the mechanics // of file I/O #include <stdio.h> #define SIZE 256 int main() { FILE *fptr = fopen("mem.txt","w+"); // Override/create a two-way file stream char buffer[SIZE + 1]; // Also hold a null char buffer[SIZE] = '\0'; if(!fptr) { // fptr will be null if not successful printf("Failed creation"); return -1; // oof no file } printf("Creation successful\n"); fprintf(fptr, "Hello, World!"); // Write to fptr // 移动指针到文件开头 fseek(fptr, 0, SEEK_SET); // 读取内容,优化参数写法 size_t read_len = fread(buffer, 1, SIZE, fptr); buffer[read_len] = '\0'; // 确保字符串终止 printf("%s\n", buffer); fclose(fptr); return 0; }
运行这段代码就能得到你预期的输出。
内容的提问来源于stack exchange,提问作者user27314297
相关产品推荐
相关产品推荐

