【问题标题】:fopen fails in linux but works in windowsfopen 在 linux 中失败,但在 windows 中有效
【发布时间】:2012-11-19 14:22:48
【问题描述】:

当我运行下面的代码时,它在 linux 中失败,但在 windows 中没有问题。 文件名类似于“src/folder/file”

char* loadProgSource(const char* filename, size_t* finalLength)
{
    char* returnStr;
    FILE* file = fopen(filename, "rb");
    if(file == NULL) return NULL;

    fseek(file, 0, SEEK_END);
    *finalLength = ftell(file);
    fseek(file, 0, SEEK_SET);

    returnStr = (char*) malloc(*finalLength+1);

    if(fread(returnStr, sizeof(char), *finalLength, file) != *finalLength) {
        fclose(file);
        free(returnStr);
        return NULL;
    }
    returnStr[*finalLength] = '\0';

    return returnStr;
}

【问题讨论】:

  • 能否提供运行输出,因为它可能是文件路径、内存泄漏......等等
  • 您知道“工作目录”、“相对路径”和“绝对路径”等术语吗?
  • 在无法打开文件的情况下打印errno以获取更多信息
  • 这不是 C++。我看不出您的代码有任何本质上的错误;您需要告诉我们在哪里它失败了,以及发生了什么错误消息。
  • 至少有两件事是错误的:1) malloc() 可能会失败并且没有处理! 2) file 没有在无错误分支中关闭,因此打开的文件描述符会泄漏。

标签: c linux fopen


【解决方案1】:

不仅用于调试使用perror(),以防系统命令失败。

你可以像这样修改代码:

...

if (file == NULL) 
{
    perror("fopen");
    return NULL;
}

...

returnStr = malloc(*finalLength+1); /* note that casting 'malloc()' is not necessary and also not recommended uin C */
if (!returnStr)
{
  perror("malloc");
  return NULL;
}

...

if (fread(returnStr, sizeof(char), *finalLength, file) != *finalLength) 
{
  perror("fread");
  ...

fseek()ftell()fclose() 的调用添加错误检查留作练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多