gpt4 book ai didi

c++ - 从文件读取值时附加到输出的垃圾

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:34 31 4
gpt4 key购买 nike

我是 C++ 文件 io 的新手,所以前几天我决定编写一个小程序,它只从二进制文件中读取 UTF-8 编码的字符串和成对的 float 。该模式是 string-float,没有额外的数据或对之间的间距。 编辑 我已经根据几个答案修改了代码。但是,输出保持不变(“The RoommateAp 0”);

string readString (ifstream* file)
{
//Get the length of the upcoming string
uint16_t stringSize = 0;
file->read(reinterpret_cast<char*>(&stringSize), sizeof(char) * 2);

//Now that we know how long buffer should be, initialize it
char* buffer = new char[stringSize + 1];
buffer[stringSize] = '\0';

//Read in a number of chars equal to stringSize
file->read(buffer, stringSize);
//Build a string out of the data
string result = buffer;

delete[] buffer;
return result;
}

float readFloat (ifstream* file)
{
float buffer = 0;
file->read(reinterpret_cast<char*>(&buffer), sizeof(float));
return buffer;
}

int main()
{
//Create new file that's open for reading
ifstream file("movies.dat", ios::in|ios::binary);
//Make sure the file is open before starting to read
if (file.is_open())
{
while (!file.eof())
{
cout << readString(&file) << endl;
cout << readFloat(&file) << endl;
}
file.close();
}
else
{
cout << "Unable to open file" << endl;
}
}

以及文件中的数据样本(可读性空间):

000C 54686520526F6F6D6D617465 41700000

如您所见,前两个字节是字符串的长度(在本例中为 12),后面是十二个字符(拼写为“The Roommate”),最后四个字节是一个 float 。

当我运行这段代码时,唯一发生的事情是终端挂起,我必须手动关闭它。我认为这可能是因为我正在阅读文件末尾,但我不知道为什么会发生这种情况。我做错了什么?

最佳答案

至少有两个问题。首先,行:

file->read(reinterpret_cast<char*>(stringSize), sizeof(char) * 2);

可能应该取stringSize的地址:

file->read(reinterpret_cast<char*>(&stringSize), sizeof(stringSize));

二、线路:

char* buffer = new char[stringSize];

没有分配足够的内存,因为它没有考虑 NUL 终止符。该代码应该执行以下操作:

//Now that we know how long buffer should be, initialize it
char* buffer = new char[stringSize + 1];
//Read in a number of chars equal to stringSize
file->read(buffer, stringSize);
buffer[stringSize] = '\0';

最后一行:

return static_cast<string>(buffer);

在从中实例化一个字符串后,无法删除[]缓冲区,这将导致内存泄漏。

另请注意,std::string 对 UTF-8 的支持非常差。还好有solutions .

关于c++ - 从文件读取值时附加到输出的垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4986876/

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