首页 > 解决方案 > FILE *tmp = tmpfile() 总是在 C 中生成 NULL 指针?

问题描述

我有以下代码:

char buffer[8];

int main(int argc, char *argv[]) {
    FILE *input, *output, *tempFile;
    input = fopen(argv[1], "rb");
    if (input == NULL) {
        printf("%s", strerror(2));
        exit(EXIT_FAILURE);
    }
    else {
        output = fopen(argv[2], "wb");
        if (output == NULL) {
            printf("%s", strerror(2));
            exit(EXIT_FAILURE);
        }
    }
    tempFile = tmpfile();
    for (int i = 0; i < 8; i++) {
        fputc(buffer[i], tempFile);
        fillBuffer(tempFile);
        printf("%s", buffer);
    }
    if (tempFile == NULL) { 
        printf("Unable to create temp file"); 
        return 0; 
    } 
}

有些东西被遗漏了,但我相信这是相关的部分。buffer[] 数组有效。如果在 for 循环中我使用

fputc(缓冲区[i],输出);

正确的信息存储在输出文件中。每当我运行这个程序时,我都会得到一堆空结果,然后是“无法创建临时文件”。建议?

标签: cfilebuffer

解决方案


tmpfile函数是标准 C 语言,应该以程序不必关心的某种抽象方式创建临时文件。如果这些文件甚至在文件系统中位置(不需要它们),则该位置应该是适合临时文件的位置。

似乎 MSVC 的实现tmpfile是错误的,并且出于历史原因尝试将文件放入"C:\"其中。如果您要在 MSVC 上构建,您需要使用不同的非标准函数或替换来解决问题,方法是首先在临时文件的有效位置安全地创建一个文件,然后调用fopen它。

可能可以通过设置环境变量来解决此问题,但如果默认情况下已损坏,则可能不适合您要部署/发布的程序。


推荐阅读