c - 为什么我的简单 C 程序向标准输出显示垃圾信息?

标签 c file-io

考虑以下简单的 C 程序,该程序将文件读​​入缓冲区并将该缓冲区显示到控制台:

#include<stdio.h>

main()
{
  FILE *file;
    char *buffer;
    unsigned long fileLen;
    //Open file
    file = fopen("HelloWorld.txt", "rb");
    if (!file)
    {
        fprintf(stderr, "Unable to open file %s", "HelloWorld.txt");
        return;
    }
    //Get file length
    fseek(file, 0, SEEK_END);
    fileLen=ftell(file);
    fseek(file, 0, SEEK_SET);
    //Allocate memory
    buffer=(char *)malloc(fileLen+1);
    if (!buffer)
    {
        fprintf(stderr, "Memory error!");
        fclose(file);
        return;
    }
    //Read file contents into buffer
    fread(buffer, fileLen, 1, file);
    //Send buffer contents to stdout
    printf("%s\n",buffer);    
    fclose(file);
}

它将读取的文件仅包含:

Hello World!

输出是:

Hello World!²²²²▌▌▌▌▌▌▌↔☺

我已经有一段时间没有在 C/C++ 中做任何重要的事情了,但通常我会假设缓冲区分配的比需要的大,但事实似乎并非如此。

fileLen 最终为 12,这是准确的。

我现在在想,我一定是错误地显示了缓冲区,但我不确定我做错了什么。

谁能告诉我我做错了什么?

最佳答案

您需要以 NUL 终止您的字符串。添加

buffer[fileLen] = 0;

打印之前。

关于c - 为什么我的简单 C 程序向标准输出显示垃圾信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/260235/

相关文章:

c - '(' token 之前的预期标识符或 '&'

performance - 高效的文件I/O和字符串到浮点的转换

c++ - 使用 ifstream 读取字节

python - 如何按升序浏览目录中的文件

c - readv和writev的工作流程。使用 readv 和 writev 而不是使用 read 和 write 的所有优点是什么?

c - 编译 C 代码时,如何指定要从 .so 库导出的函数?

c - 在 Sublime Text 3 中运行 C 仅显示 [finished ...s]

c - 指向字符串的指针数组(指针的基本类型)

c# - 如何从内存流中打开文件

c++ - "Error deleting file: Permission denied"在 C++ 中删除