如何从子目录中读取C中的文件

时间:2012-01-06 01:35:14

标签: c file unix

这让我发疯了。我想从子目录(./method/CoyoteAdapter.java.tk.method.514.5.533.5.bk)中读取,但我的代码在fscan崩溃(总线错误):

void readFrag( int **sequence, int& nTokens, char* fragName )
{
    FILE *file;
    char tmp[200];

    strncpy(tmp, &fragName[2], 198);

    char szWorkingDirectory[PATH_MAX];
    szWorkingDirectory[0] = '\0';
    getwd(szWorkingDirectory);

    printf("Attempting to open %s/%s\n", szWorkingDirectory, tmp);
    file = fopen(tmp, "r");

    nTokens = 0;
    fscanf(file, "%d", &(*sequence)[nTokens]);

    while(!feof (file))
    {
        fscanf(file, "%d", &(*sequence)[nTokens]);
        ++nTokens;
    }

    fclose(file);
}

// maxFragSizes: Each block has its max frag size
void init( int **seq, int& seqSize, int **sub, int& subSize, int **problemSizesPerBlock, char* fragListName )
{
    FILE *file;
    char line[200];

    int* tokens = new int[THREADS_PER_BLOCK-1]; 
    int nTokens = 0;

    file = fopen(fragListName, "rt");

    while(fgets(line, 200, file) != NULL)
    {
        readFrag( &(*seq), nTokens, line ); 
    }

    fclose(file);

}

但是,如果我将文件复制到我的目录,它就可以了。我在UNIX(Mac OS)上。请帮忙!

编辑:我按照建议添加了以下代码。输出没问题,但它仍然不起作用......

4 个答案:

答案 0 :(得分:2)

您必须验证文件指针。可能是找不到文件,或者您没有足够的权限来阅读它。

 file = fopen(fragName, "rt");
 if(file==NULL)
 {
    printf("\nFile not found");
    return 0;
  }
 fscanf(file, "%d", &tmp);

答案 1 :(得分:2)

AVD is almost right - 您需要检查FILE* fopen(3)以查看您是否确实打开了该文件。但他的答案(和selbie's similar answer)都忽略了最重要的一条信息: fopen(3)失败的原因

试试这个:

void readFrag( char* fragName )
{
    FILE *file;
    int tmp;

    file = fopen(fragName, "r");
    if (!file) {
        perror("Error reading fragment file in readFrag");
        return;
    }
    fscanf(file, "%d", &tmp);
}

我还从模式中删除了t,因为我找不到任何支持其使用的文档。我希望这个不是问题的原因 - 人们希望图书馆会更加严谨 - 但因为它是无效的输入,它肯定可能是错误的。 (检查系统的fopen(3)联机帮助页,如果我对您的平台有误,请纠正我。)

答案 2 :(得分:1)

在调用fscanf之前,您没有检查fopen()返回的“file”是否为NULL。这就是你崩溃的原因。

至于如何打开文件,您可能需要调用getcwd(getwd)并打印结果以查看您是否在您认为自己所在的父目录中。您可能不需要“./ “文件路径中的前缀,但我认为它不会受到伤害。

void readFrag( char* fragName ) 
{ 
    FILE *file; 
    int tmp; 
    char szWorkingDir[PATH_MAX];
    szWorkingDirectory[0] = '\0';
    getwd(szWorkingDirectory);

    printf("Attempting to open %s/%s\n", szWorkingDir, fragName);

    file = fopen(fragName, "rt"); 
    if (file != NULL)
        fscanf(file, "%d", &tmp); 
} 

int main()
{
    readFrag("method/CoyoteAdapter.java.tk.method.514.5.533.5.bk");
    return 0;
}

答案 3 :(得分:0)

您传递给init函数的seq的值很可能不会指向指向有效内存的指针(seq本身无效,或者*seq是)