【问题标题】:File I/O function for CC 的文件 I/O 函数
【发布时间】:2009-08-25 17:30:08
【问题描述】:
char *loadTextFile(const char *filename)
{
    FILE *fileh;
    char *text = 0;
    long filelength;
    if((fileh=fopen(filename,"rb"))== 0)
        printf("loadTextFile() - could not open file");
    else
    {
        fseek(fileh, 0, SEEK_END);
        filelength = ftell(fileh);
        rewind(fileh);
        text=(char *) smartmalloc((int)filelength + 1);
        fread(text,(int)filelength, 1, fileh);
        fclose(fileh);
        text[filelength]=0;
    }
    printf(text);
    return(text);
}

这个函数只返回一个txt文件的部分数据。它也不一致......有时有时会给出文件的 100 个字符,有时 20 个字符。我看不出有什么问题。我想我可能会得到另一双眼睛。谢谢。

【问题讨论】:

  • 您忘记将问题表述为问题。如果你清楚地表明你期望的答案是什么,这会有所帮助,也许在某处有一个问号。
  • 我发现它有一些问题。例如,没有称为smartmalloc 的标准C 函数。我会发布一个修订版。
  • 这是一个cgi-html库函数
  • @Tommy:糟糕的图书馆......糟糕,糟糕,糟糕的图书馆。
  • 你的文本文件编码是否一致?

标签: c file-io


【解决方案1】:

需要检查的明显事项:

ftell(fileh) 给了你什么?

文件中可以嵌入 NUL 字符吗?这会导致 printf(text) 过早停止。

【讨论】:

  • 看起来像正确数量的字符 2705 是的,可能有,但我被甩了,因为我在不同的地方终止,它不一致。
  • 这表明您的文件中包含 NULL。用最后一个 printf 替换 fwrite(text, 1, length, stdout);并告诉结果
【解决方案2】:

这是您的代码更好的版本。您需要对 IO 函数调用进行更多错误检查。此外,还有烦人的 longsize_t 隐式转换,我建议在生产代码中正确处理。

char* loadTextFile(const char *filename) {
    char *text;
    long length;

    FILE *fileh = fopen(filename, "rb");
    if ( !fileh ) {
        return NULL;
    }

    fseek(fileh, 0, SEEK_END);
    length = ftell(fileh);
    rewind(fileh);

    text = malloc(length + 1);

    if ( !text ) {
        return NULL;
    }

    fread(text, 1, length, fileh);
    text[length] = 0;

    fclose(fileh);

    return text;
}

请注意,John R. Strohm 是正确的:如果您对已阅读内容的评估是基于 printf 打印的内容,那么您可能会被嵌入的 nuls 误导。

【讨论】:

  • 谢谢,我很感激。去看看能不能先找出坏函数。
  • 看起来我被 printf 和调试器误导了。当我在其最终目的地(网页)显示返回的数据时,它会显示全部。不知道为什么我在调试器中看不到所有内容。
  • @Tommy 因为任何嵌入的nuls 都会告诉printf 和调试器字符串的结尾在哪里。
【解决方案3】:

fread 不能保证返回您要求的字符数。您需要检查它的返回值并在循环中使用它。

示例循环(未测试):

char *p = text;
do {
    size_t n = fread(p,1,(size_t)filelength, fileh);
    if (n == 0) {
       *p = '\0';
       break;
    }
    filelength -= n;
    p += n;
} while (filelength > 0);

n==0 的测试捕获了在您尝试读取文件时其他进程截断文件的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2016-01-26
    • 2012-11-05
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多