C,读取文本文件时字符串中的垃圾/垃圾值

时间:2018-02-20 02:04:38

标签: c memory-management heap-memory

我正在尝试在C中读取.txt文件(paragraph.txt作为输入),当我打印字符串时,它的末尾有垃圾值,例如我的visual studio路径或垃圾数据。这种情况在99%的情况下发生,但有一些例外。我不知道为什么会这样做?

void readfile(char **buffer, char *input)
{
    FILE *file = fopen(input, "r");
    int bytes = filesize(file);
    *buffer = (char*)malloc(bytes);
    fread(*buffer, bytes, 1, file);
    printf("%s\n", *buffer);
    fclose(file);
}

我的filesize函数只返回一个文件的字节数,我检查过它并且它是正确的(返回4412个字节,这是我拥有的确切字符数)。 函数被称为:

readfile(&buffer, input);

1 个答案:

答案 0 :(得分:0)

因为两个错误而显示“垃圾”:

  1. 您没有为内容加上分配足够的内存 '\0' - 终止字节。
  2. 您没有设置'\0' - 终止字节。 fread不会这样做,因为 fread并不关心它正在读取的字节的含义,它只是读取 一块记忆,就是这样。
  3. int readfile(char **buffer, const char *input)
    {
        if(buffer == NULL)
            return 0;
    
        FILE *file = fopen(input, "r");
        if(file == NULL)
        {
            fprintf(stderr, "could not open %s for reading: %s\n", input,
                    strerror(errno));
            return 0;
        }
    
        int bytes = filesize(file);
    
        *buffer = malloc(bytes + 1);
        if(*buffer == NULL)
        {
            fprintf(stderr, "Not enough memory\n");
            fclose(file);
            return 0;
        }
    
        if(fread(*buffer, bytes, 1, file) != 1)
        {
            fprintf(stderr, "could not read\n");
            free(*buffer);
            *buffer = NULL;
            fclose(file);
            return 0;
        }
    
        (*buffer)[bytes] = 0; // setting the 0 byte
        puts(*buffer);
        fclose(file);
    
        return 1;
    }
    

    您还应该始终检查函数的返回码,特别是那些 返回指针和/或写入传递它们的指针。如果其中之一 函数返回错误,否则你会有未定义的行为。

    修改

    你说的评论中的

      

    我通过执行*buffer[bytes-1] = '\0';尝试了这个,但它在尝试执行此操作时崩溃了该程序

    那是因为buffer[bytes-1]buffer + bytes -1相同 超出buffer指向的范围。当你试图取消引用它 与*一起,它会崩溃。你需要做的(就像我在代码中所做的那样)是: (*buffer)[bytes] = 0;buffer[0][bytes] = 0相同。