FILE * tmp = tmpfile () всегда генерирует NULL-указатель в C? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть следующий код:

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 [] действителен. Если для l oop я использую

fput c (buffer [i], output);

Правильная информация сохраняется в выходном файле . Всякий раз, когда я запускаю эту программу, я получаю кучу нулевых результатов, за которыми следует «Невозможно создать временный файл». Совет?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Функция tmpfile является стандартной C и предназначена для создания временных файлов некоторым абстрактным способом, о котором программе не должно заботиться. Если эти файлы даже имеют местоположения (в них нет необходимости) в файловой системе, местоположение должно быть таким, которое подходит для временных файлов.

Кажется, MSV C реализация tmpfile содержит ошибки и пытается поместить файлы в "C:\" по техническим причинам. Если вы будете строить на MSV C, вам нужно либо использовать другую нестандартную функцию, либо добавить замену, чтобы решить проблему, сначала создав файл безопасно в допустимом месте для временных файлов, а затем позвонив на него fopen .

Возможно, это можно исправить, установив переменную среды, но если она не работает по умолчанию, это, вероятно, не подходящее исправление для программы, которую вы хотите развернуть / отправить.

0 голосов
/ 29 мая 2020

Я должен использовать:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main()
{
    FILE *f = tmpfile();
    if (!f) {
        fprintf(stderr, 
                "couldn't create tmpfile: %s (errno = %d)\n",
                strerror(errno), errno);
        exit(EXIT_FAILURE);
    }
}

, чтобы узнать причину невозможности создания временного файла. Я только что запустил его в своей системе, и он правильно создает файл. (и это должен быть минимальный, полный и проверяемый пример , как я рекомендую вам прочитать в моем комментарии к вашему вопросу), но, скорее всего, если бы вы это сделали, вам никогда не следовало бы задавать этот вопрос (поскольку причина, вероятно, указана в выводе вашей программы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...