tmpfile_s返回成功但写入后读取为空的权限问题及疑问
tmpfile_s返回0但临时文件无法读写的权限问题分析
问题重现
以下是最小复现代码:
#include <stdio.h> int main() { FILE *test_fileptr; int errorcode; errorcode = tmpfile_s(&test_fileptr); fputs("{}", test_fileptr); fflush(test_fileptr); rewind(test_fileptr); int c; int read_count = 0; char buffer[5] = "wxyz"; while(read_count < 4) { c = fgetc(test_fileptr); if( feof(test_fileptr) ) { break; } buffer[read_count++] = c; printf("%c", c); printf(",%d", c); } printf("%s %d", "\ntmpfile return code was", errorcode); fclose(test_fileptr); return 0; }
实际输出:
,-1 ,-1 ,-1 ,-1 tmpfile return code was 0
预期能读取到写入的{}字符,但实际读取失败,且tmpfile_s返回0(表示成功)。提升进程权限后代码可正常运行,说明问题源于权限不足,但与cppreference对tmpfile_s返回值的说明存在疑惑:
若文件创建并成功打开则返回0,若文件未创建/打开或streamptr为空指针则返回非0。
原因分析
tmpfile_s的职责边界
tmpfile_s仅负责创建临时文件并打开获取FILE指针,它的返回值仅反映这一阶段是否成功。只要系统能在临时目录中创建出文件,并返回有效的FILE指针,tmpfile_s就会返回0。权限问题发生在IO操作阶段
你的场景中,进程拥有创建临时文件的权限(所以tmpfile_s返回0),但不具备对该文件的读写权限——这种权限限制是在后续的fputs、fgetc等IO操作时才触发的,不属于tmpfile_s的检测范围。代码未检测IO操作错误
代码没有检查fputs的返回值(写入失败时fputs会返回EOF),也没有用ferror()检测读取阶段的错误,仅通过feof()判断是否到文件尾,导致把“读取权限被拒绝”的错误结果当成了“文件已读完”,从而输出了多个-1(fgetc读取失败时返回EOF,即-1)。
验证与修复建议
- 在
fputs后添加返回值检查,捕获写入错误:if (fputs("{}", test_fileptr) == EOF) { perror("fputs failed"); } - 在读取循环中添加错误检测,明确读取失败原因:
c = fgetc(test_fileptr); if (ferror(test_fileptr)) { perror("fgetc failed"); break; } if (feof(test_fileptr)) { break; }
内容的提问来源于stack exchange,提问作者JasonDAquila
相关产品推荐
相关产品推荐

