C的文件I / O功能

时间:2009-08-25 17:30:09

标签: c file-io

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文件的部分数据。它也是不一致的... soemtimes在20次给我100个字符的文件。我没有看到它有什么问题。以为我可能会看到另一双眼睛。感谢。

3 个答案:

答案 0 :(得分:4)

要检查的明显事项:

ftell(fileh)给你带来了什么?

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

答案 1 :(得分:3)

这是稍微更好的代码版本。您需要使用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打印的内容,则您可能会被嵌入式nul误导。

答案 2 :(得分: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的测试捕获了一些其他进程在您尝试读取时截断文件的情况。