【问题标题】:Unexpected behaviour from function reading file in CC中函数读取文件的意外行为
【发布时间】:2018-03-05 05:13:16
【问题描述】:

好的,我首先要说我正在制作一个网络服务器。我有一个函数getFileContent 我用来从我的文件中获取我的内容,看起来像这样

char* getFileContent(char *filename)
{
    long length;
    char *buffer;
    FILE *f = fopen (filename, "r");
    if (f) {
        fseek (f, 0, SEEK_END);
        length = ftell (f);
        fseek (f, 0, SEEK_SET);
        buffer = malloc (length + 1);
        if (buffer) {
            fread (buffer, 1, length, f);
        }
        fclose (f);
    }

    if (buffer != 0) {
        return buffer;
    } else {
        return NULL;
    }
}

当调用这个函数时,我得到了一些奇怪的行为。
如果我像这样只调用一次
char *fileContent = getFileContent(path);
例如,当我要返回文件内容时,它会附加 2 或 3 个奇怪的字符。
但是,如果我将它两次​​调用到同一个变量,它会附加另一组奇怪的字符。

但是,如果我在程序开始时第三次调用该函数,在main 中。例如,通过将/etc/hosts/ 中的内容获取到一个完全不同且未使用的变量,它会在稍后的代码中正常打印输出。

我已尝试查看问题,但它似乎很随机,如果有人能帮助我解决这个问题,我将不胜感激。

【问题讨论】:

  • 那么你的函数的结尾可以只替换为return buffer;
  • 如果打开文件失败,则读取buffer的未初始化值。编译器应该能够对此发出警告...

标签: c linux io


【解决方案1】:

当您读取文件内容时,您的缓冲区没有 NUL 终止。因此,如果您将其视为 C 字符串(例如 printf),您将调用未定义的行为。

您应该检查fread 的返回值,并在最后一个字节读取后放置'\0'

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多