我正在尝试写入二进制文件,这是我的代码片段
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct user
{
string ID;
string password;
};
int main()
{
fstream afile;
afile.open("user.dat",ios::out|ios::binary);
user person;
person.ID ="001";
person.password ="abc";
afile.write (reinterpret_cast <const char *>(&person), sizeof (person));
person.ID ="002";
person.password ="def";
afile.write (reinterpret_cast <const char *>(&person), sizeof (person));
afile.close();
afile.open("user.dat",ios::in|ios::binary);
while (afile.read (reinterpret_cast <char *>(&person), sizeof (person)))
{
cout<<person.ID
<<" "
<<person.password
<<endl;
}
}
我期待我的控制台输出
001 abc
002 def
相反,我得到了
002 def
002 def
有人可以向我解释一下吗?
答案 0 :(得分:2)
std :: string是一个类,它的对象不直接存储字符串的内容。
这是为您的案例定义的实现,为简单起见,您可以这样理解:
std :: string有一个成员,用于将指针(比如ptr)存储到实际数据中。
和
std::string s = "001";
不会将ptr指向地址字符串“001”;它会分配内存并将字符串复制到该内存中。 然后当你做
s = "002";
它不需要重新分配内存来存储“002”;它只是将“002”复制到之前存储“001”的存储器中。
这意味着,如果转储字符串的原始数据,则不会更改。
当您回读字符串原始数据时,它只会恢复指向“002”的指针。
希望这会有所帮助。
答案 1 :(得分:2)
不幸的是,你不能这样做只是因为你只编写一个指向std :: string的指针而不是包含什么字符串。您可以通过以下方式将字符串写入二进制文件:
afile.open("user.dat",ios::out|ios::binary);
user person;
person.ID ="001";
person.password ="abc";
int len = person.ID.size();
afile.write(reinterpret_cast<char*>(&len), sizeof(len));
afile.write(const_cast<char*>(person.ID.c_str()), len);
len = person.password.size();
afile.write(reinterpret_cast<char*>(&len), sizeof(len));
afile.write(const_cast<char*>(person.password.c_str()), len);
person.ID ="002";
person.password ="def";
afile.close();
这样你可以阅读
afile.open("user.dat",ios::in|ios::binary);
afile.read(reinterpret_cast<char*>(&len), sizeof(len));
person.ID.resize(len);
afile.read(const_cast<char*>(person.ID.c_str()), len);
afile.read(reinterpret_cast<char*>(&len), sizeof(len));
person.password.resize(len);
afile.read(const_cast<char*>(person.password.c_str()), len);
cout << person.ID << " " << person.password << endl;
答案 2 :(得分:0)
您正在存储struct
的原始数据,实际上只包含指针。这就是std::string
用于存储数据以便使字符串可调整大小的方式。程序 打印任何数据的唯一原因是,在读取时,对象person
仍然存在。如果将程序的读取部分放入单独的程序中,则无法读取任何数据。
要使用fstream
实际存储数据,您可以每行存储一个字符串,例如:
afile << person.ID << endl;
afile << person.password << endl;
文件user.dat
:
001
abc
002
def
你可以这样读:
afile >> person.ID >> person.password;
while (afile.good())
{
cout<<person.ID
<<" "
<<person.password
<<endl;
afile >> person.ID >> person.password;
}