使用nvcc时,fopen无法打开可写文件

时间:2012-03-21 01:07:38

标签: gcc cuda fopen nvcc

编辑:我认为问题是由于nvcc调用C ++编译器而不是C编译器,因为我没有将malloc(3)调用转换为char *时收到错误。我通过以下方式引出了这个断言:Invalid converstion from void* to char**

EDITEDIT:如果我使用fileO = fopen(版本,“w”),它可以正常工作;绕过strcpy和strcat调用。 (哈哈,我说过嘘声......)

所以我有一个CUDA程序,我从同一程序的顺序版本(非CUDA)中收集了一些文件I / O.完全相同的代码适用于常规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 个答案:

答案 0 :(得分:1)

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));

它几乎总是一个bug。它应该是这样的:

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

即使大小计算在其他地方被突破,我也经常希望+1专门针对malloc()来电,只是为了确保我知道它将来会存在。

当您file0NULL时,您可能还应致电perror(3)告诉您为什么您无法打开该文件。它可能是“许可被拒绝”。可能是当前工作目录不再存在。 (这将阻止您在目录中创建文件,即使您的文件系统权限允许您创建文件。)