我正在尝试从二进制文件中读取字符串,但似乎无法使其工作。我是c ++的新手。有人可以帮忙吗?感谢。
string Name = "Shaun";
unsigned short int StringLength = 0;
int main()
{
StringLength = Name.size();
ofstream oFile("File.txt", ios::binary|ios::out);
oFile.write((char*)&StringLength, sizeof(unsigned short int));
oFile.write(Name.c_str(), StringLength);
oFile.close();
StringLength = 0;
Name = "NoName";
ifstream iFile("File.txt", ios::binary|ios::in);
if(!iFile.is_open())
cout << "Failed" << endl;
else
{
iFile.read((char *)&StringLength, sizeof(unsigned short int));
iFile.read((char *)&Name, StringLength);
}
cout << StringLength << " " << Name << endl;
system("Pause>NUL");
return 0;
}
答案 0 :(得分:3)
这是有问题的一行。
iFile.read((char *)&Name, StringLength);
您正在将char*
std::string
部分直接读到Name
的记忆中。
您需要保存字符串的大小以及字符串,这样当您读取数据时,您就会知道读取数据需要多少内存。
而不是
oFile.write(Name.c_str(), StringLength);
你需要:
size_t len = Name.size();
oFile.write(&len, sizeof(size_t));
oFile.write(Name.c_str(), len);
回来的路上,你需要:
iFile.read(&len, sizeof(size_t));
char* temp = new char[len+1];
iFile.read(temp, len);
temp[len] = '\0';
Name = temp;
delete [] temp;
答案 1 :(得分:1)
你需要创建一个char类型的缓冲区。
char *buffer = new char[size];
然后使用缓冲区作为参数来读取函数
iFile.read(buffer, size);
答案 2 :(得分:0)
而不是这个
iFile.read((char *)&Name, StringLength);
试试这个:
Name.resize(StringLength);
iFile.read((char *)&Name[0], StringLength);
您的原始行会从头开始覆盖字符串对象数据,例如,可能包含字符串长度和容量,而不是字符数据。此外,您不必适当调整字符串的大小以便能够包含数据。
答案 3 :(得分:0)
从概念上讲,您需要了解所读取的数据流。并非所有人都使用ASCII码,ASCII码使用8位字节大小。我还注意到您没有设置读取的位大小,该位大小可以低至{R,B,G,A}颜色集。使用基本的二维重复结构化代码。