fopen не может открыть доступный для записи файл при использовании nvcc - PullRequest
1 голос
/ 21 марта 2012

РЕДАКТИРОВАТЬ: я считаю, что проблема заключается в том, что nvcc вызывает компилятор C ++ вместо компилятора C из-за ошибки, которую я получаю, когда не преобразую вызов malloc (3) в char *.Я привел к этому утверждению: Недопустимый разговор от void * к символу **

EDITEDIT: он отлично работает, если я использую fileO = fopen (версия, "w");в обход вызовов strcpy и strcat.(ха-ха, я сказал catcalls ...)

Итак, у меня есть программа CUDA, в которой я собрал некоторый файловый ввод / вывод из последовательной версии той же программы (не-CUDA).Точно такой же код работает с обычными компиляторами gcc, но не через nvcc.Я знаю, что nvcc шунтирует C / C ++ для собственного компилятора C ++, но по какой-то причине он просто не открывает доступный для записи файл.Я открыл и закрыл другой поток файлов для чтения данных в приведенном выше коде, но я делаю это в своей последовательной версии, и там все работает нормально.

Вот соответствующий код:

else 
{
    char* version = "matrixExpCUDAx";
    char* filename = (char *)malloc(strlen(version) + strlen(argv[3]));

    strcpy(filename, version);
    strcat(filename, argv[3]);

    FILE *fileO;
    fileO = fopen(filename, "w");   

    if(DEBUG)
    {
        for (i=0; i<(dim*dim); i++) fprintf(stderr, "%f\n", h_O[i]);
    }
    else
    {
        if(fileO != NULL)
        {
            for (i=0; i<(dim*dim); i++)
            {
                fprintf(fileO, "%f\n", h_O[i]);
            }
            fclose(fileO);
        }
        else fprintf(stderr, "Write file failed to create\n");
    }
}
....

Я получаю сообщение «Не удалось создать файл» каждый раз.

Есть идеи?

1 Ответ

1 голос
/ 21 марта 2012
char* filename = (char *)malloc(strlen(version) + strlen(argv[3]));

Во-первых, вам не нужно приводить возвращаемое значение из malloc(3).Если вы добавите #include <stdlib.h> в свою программу, вы получите прототип malloc(3), который сообщает компилятору, как правильно обрабатывать возвращаемое значение из malloc(3).Самостоятельная проверка может помочь в написании полезных предупреждений или ошибок, которые могут выявить ошибки.Добавьте #include и удалите приведение.

Кроме того, это, кажется, не выделяет достаточно памяти для вашего имени файла;не забывайте, что strlen(3) не не включает пробел для завершающего байта ASCII NUL в конце строки, но вашему filename определенно понадобится этот завершающий NUL.

Всякий раз, когда вы видите такой код:

bar = malloc(strlen(foo));

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

bar = malloc(strlen(foo)+1);

Даже если вычисление размера нарушено в другом месте, я часто хотел бы поместить +1 в вызов malloc() специально, просто чтобы убедиться, что я его знаюесть в будущем.

Когда ваш file0 равен NULL, вам, вероятно, также следует позвонить perror(3), чтобы сообщить , почему вы не смогли открыть файл.Это может быть «отказано в разрешении».Возможно, текущий рабочий каталог больше не существует.(Это не позволит вам создавать файлы в каталоге, даже если разрешения вашей файловой системы в противном случае позволят вам создавать файлы.)

...