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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:33:14