c - C 中函数读取文件的意外行为

标签 c linux io

好吧,我首先要说的是我正在制作一个网络服务器。我有一个函数 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/ 中的内容获取到完全不同且未使用的变量,它会在代码中正常打印输出。

我试图找出这个问题,但它看起来很随机,如果有人能帮助我解决这个问题,我将非常感激。

最佳答案

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

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

关于c - C 中函数读取文件的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384782/

相关文章:

java - 流是否会在出错时自动关闭?

linux - 狂欢 : wrong pipe output when using "sudo sh -c"

c - 在自定义函数中再次包含相同的头文件,哪些已经包含在主程序中?

c - 当定义它的程序作为参数传递时,execl 不工作

c - 检索int的二进制值,输出二进制对应的ASCII

linux - bash 中的日期格式

linux - 在 bash 上对版本字符串进行排序

windows - Windows/Windows CE的串行I/O重叠/不重叠

profiling - 我应该使用什么分析器来测量_real_ 时间(包括等待系统调用)在此函数中花费,而不是 _CPU_ 时间

计算句子字符