如何合规读取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
相关产品推荐
相关产品推荐

