为什么 fread() 会给出额外的垃圾值

问题描述 投票:0回答:3

我正在读取文件的内容并尝试打印它,但它提供了额外的垃圾值。

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>

int main() {
    long length;
    char* content;
    FILE *file = fopen("text.txt", "r");
    fseek(file, 0, SEEK_END);
    length = ftell(file);
    fseek(file, 0, SEEK_SET);
    content = (char *)malloc(length);
    fread(content, 1, length, file);
    printf("%s\n", content);
    return 0;
}

也许我必须取消终止

content[length] = '\0';

文件末尾的

\n
换行符越多,我得到的垃圾就越多。

除了使用

calloc
之外还有什么解决方案吗?

c pointers malloc fread
3个回答
3
投票

如果这是 MSVC(由

#define _CRT_SECURE_NO_DEPRECATE
提示),那么默认情况下文件模式可能是 text,并且当您读取它时,所有 CR-LF 对将收缩为单个 LF。获取文件大小并没有考虑到这一点。使用实际读取的字符数来终止字符串。

content = malloc(length + 1);           // room for terminator
size_t bytes = fread(content, 1, length, file);
content[bytes] = '\0';

1
投票

文件内容不以空字符结尾。 您应该将分配的内存缓冲区重置为 0,因为不知道将读取多少字节。

content = (char *)malloc(length + 1);
memset(content, 0, length + 1);
fread(content, 1, length, file);

或者您应该在打印时设置数据长度

length = fread(content, 1, length, file);
printf("%.*s\n", length, content);

参见 有没有办法指定使用 printf() 打印出字符串的多少个字符?


0
投票

试试这个方法

char buffer[14]; int cnt = 0;
buffer[13] = '\0';
while(fread(buffer, 13, 1 ,fptr) != NULL){
    printf("Buffer #%d :: %s\n", ++cnt, buffer);
}

添加 到数组末尾将导致不溢出。

© www.soinside.com 2019 - 2024. All rights reserved.