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

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。

原因分析

  1. tmpfile_s的职责边界
    tmpfile_s仅负责创建临时文件并打开获取FILE指针,它的返回值仅反映这一阶段是否成功。只要系统能在临时目录中创建出文件,并返回有效的FILE指针,tmpfile_s就会返回0。

  2. 权限问题发生在IO操作阶段
    你的场景中,进程拥有创建临时文件的权限(所以tmpfile_s返回0),但不具备对该文件的读写权限——这种权限限制是在后续的fputs、fgetc等IO操作时才触发的,不属于tmpfile_s的检测范围。

  3. 代码未检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:22:17