调试读/写字符串到二进制文件

时间:2014-01-03 04:56:18

标签: c++ debugging file-io binary binaryfiles

我正在尝试写入二进制文件,这是我的代码片段

#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

有人可以向我解释一下吗?

3 个答案:

答案 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;    
}

您还应该检查Serializing a class which contains a std::string