gpt4 book ai didi

c++ - fread 在缓冲区中存储随机字符

转载 作者:行者123 更新时间:2023-11-30 01:58:13 26 4
gpt4 key购买 nike

我只是尝试使用 fread 读取文件并输出内容。它部分工作。它正确输出所有内容,但以一堆随机字符结尾。

#include <iostream>

using namespace std;

void ReadFile(char* filename,char*& buffer)
{
FILE *file = fopen(filename,"rb");

fseek(file,0,SEEK_END);
int size = ftell(file);
rewind(file);

buffer = new char[size];
memset(buffer,0,size);

int r = fread(buffer,1,size,file);
cout << buffer;

fclose(file);
}

int main()
{
char* buffer;
ReadFile("test.txt",buffer);
cin.get();
}

假设在本例中“大小”为 50。由于某种原因,调用 fread 后缓冲区的大小最终为 55 或 56。我在使用之前清空了缓冲区并尝试输出它,一切正常(它是空的)。在调用 fread 之后,缓冲区以某种方式变大并填充了随机字符。我已经在十六进制编辑器中打开了文本文件,以确保没有任何我没有看到但实际上没有的东西。该文件为 50 字节。 fread 返回读取的字节数,在本例中返回到 'r','r' 是它应该是的。那么这些字节来自哪里?

简化:fread 返回正确的读取字节数,但在调用 fread 后缓冲区以某种方式使自身变大,然后用随机字符填充它。为什么?

我一辈子都弄不明白这是怎么回事。

另外,在任何人给我一个简单的修复之前,我已经知道我可以做 buffer[r] = '\0' 并且不再输出随机字符,但我更想知道为什么会这样。

最佳答案

cout<< char* 上的接线员需要 C 字符串,所以你需要以 null 终止你的 buffer :

int size = ftell(file)+1; // Leave space for null terminator
...
int r = fread(buffer,1,size-1,file);
buffer[r] = '\0';
cout << buffer;

您看到的额外字符是 buffer 结束后内存地址中的随机数据. operator <<不知道字符串已经结束,所以它继续打印直到找到第一个 '\0'字节。

关于c++ - fread 在缓冲区中存储随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17707904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com