gpt4 book ai didi

c++ - 从二进制文件中读取 std::string

转载 作者:行者123 更新时间:2023-11-30 00:42:21 26 4
gpt4 key购买 nike

我有几个前段时间创建的函数,用于读取和写入 std::strings 到以二进制模式打开以读取的 FILE*。他们之前工作得很好(并且 WriteString() 仍然有效)但是 ReadString() 在运行时一直给我内存损坏错误。字符串的存储方式是在字符串数据之前将其大小写为 unsigned int 作为 char。

bool WriteString(std::string t_str, FILE* t_fp) {
// Does the file stream exist and is it valid? If not, return false.
if (t_fp == NULL) return false;
// Create char pointer from string.
char* text = const_cast<char*>(t_str.c_str());
// Find the length of the string.
unsigned int size = t_str.size();
// Write the string's size to the file.
fwrite(&size, sizeof(unsigned int), 1, t_fp);
// Followed by the string itself.
fwrite(text, 1, size, t_fp);
// Everything worked, so return true.
return true;

}



std::string ReadString(FILE* t_fp) {
// Does the file stream exist and is it valid? If not, return false.
if (t_fp == NULL) return false;
// Create new string object to store the retrieved text and to return to the calling function.
std::string str;
// Create a char pointer for temporary storage.
char* text = new char;
// UInt for storing the string's size.
unsigned int size;
// Read the size of the string from the file and store it in size.
fread(&size, sizeof(unsigned int), 1, t_fp);
// Read [size] number of characters from the string and store them in text.
fread(text, 1, size, t_fp);
// Store the contents of text in str.
str = text;
// Resize str to match the size else we get extra cruft (line endings methinks).
str.resize(size);
// Finally, return the string to the calling function.
return str;

}

任何人都可以看到此代码有任何问题或有任何替代建议吗?

最佳答案

我遇到的最大问题:

// Create a char pointer for temporary storage.
char* text = new char;
// ...
// Read [size] number of characters from the string and store them in text.
fread(text, 1, size, t_fp);

这会将文本创建为指向单个 字符的指针,然后您尝试将任意数量的字符(可能不止一个)读入其中。为了使其正常工作,您必须在确定大小后将文本创建为字符的数组,如下所示:

// UInt for storing the string's size.
unsigned int size;
// Read the size of the string from the file and store it in size.
fread(&size, sizeof(unsigned int), 1, t_fp);
// Create a char pointer for temporary storage.
char* text = new char[size];
// Read [size] number of characters from the string and store them in text.
fread(text, 1, size, t_fp);

其次,您没有释放分配给文本的内存。你需要这样做:

// Free the temporary storage
delete[] text;

最后,您选择在 C++ 中使用 C 文件 I/O 是否有充分的理由?使用 C++ 风格的 iostream 可以缓解所有这些问题,并使您的代码更短、更易读。

关于c++ - 从二进制文件中读取 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262715/

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