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

如何合规读取tmpfile()创建的临时文件?我的代码为何读取失败?

关于tmpfile()的标准读取方式及代码问题分析

核心问题说明

C标准确实不保证tmpfile()创建的临时文件存在可访问的文件路径,该函数的设计目标是生成一个关闭后自动删除的临时文件,全程仅通过返回的FILE*指针进行读写操作即可,这就是标准规定的使用方式。

代码问题分析

你遇到的读取失败并非平台不合规,而是代码忽略了文件指针位置的问题:

  • fwrite执行完成后,文件指针会停在写入内容的末尾
  • 此时直接调用fread会立即触发EOF(文件结束),因此返回0且feof(fp)为真,完全符合C标准的行为

修正后的代码示例

struct foo {
    // 补充具体成员定义
};

FILE *fp = tmpfile();
if (fp == NULL) {
    perror("tmpfile 创建失败");
    return 1;
}

struct foo x = { /* 初始化成员值 */ };
struct foo y = { /* 初始化成员值 */ };

// 写入数据
int err = fwrite(&x, sizeof(struct foo), 1, fp);
printf("err: %x/%x\n", err, errno);
fflush(fp);

// 将文件指针移回文件开头(关键步骤)
rewind(fp); // 等价于 fseek(fp, 0, SEEK_SET);

// 读取数据
err = fread(&y, sizeof(struct foo), 1, fp);
printf("err: %x/%x\n", err, feof(fp));

// 关闭文件,tmpfile创建的文件会自动删除
fclose(fp);

输出说明

修正后,fread会成功读取到之前写入的内容,返回值为1,feof(fp)为0,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:05