我创建了一个程序,它将对象写入文件(通过将其转换为char),然后从文件中检索记录并将其分配给变量。 。
这是我的问题:
我有一个人类,有两个名为name和Address的成员变量 我通过我的程序创建一个person类对象,然后将其写入文件 当我检索回记录时,我只能检索名称,但我无法检索地址。
这是我的代码: -
我的主要课程
int _tmain(int argc, _TCHAR* argv[])
{
Person p1;
p1.setName("Jim");
p1.setAddress("USA");
Person p2;
File writeToFile;
writeToFile.writeObject(p1); //write the object to the file using method
fstream readFile("Filet.txt",ios::in); //creates an object of fstream to retrieve records
// declared 2 variable to hold the values
string name;
string address;
//loop until its end of the file
while(!readFile.eof())
{
readFile>>name>>address; //assign the record to the variables
}
p2.setName(name); //initialize the object's members
p2.setAddress(address);
cout<<p2.getName()<<""<< p2.getAddress()<<endl; //print the values
system("pause");
return 0;
}
这是程序输出的内容:
这里似乎有什么问题?
感谢您的时间
编辑: -
我的人员类实施
Person::Person(){}
void Person:: setName(string tname)
{
int length=tname.size();
length=length<5 ? length : 4;
tname.copy(name,length);
name[length]='\0';
}
string Person::getName()
{
return this->name;
}
void Person:: setAddress(string taddress)
{
int length=taddress.size();
length=length<15 ? length:14;
taddress.copy(address,length);
address[length]='\0';
}
string Person:: getAddress()
{
return this->address;
}
我的writeObject方法实现
string File:: writeObject (Person obj)
{
fstream writeFile;
writeFile.open("Filet.txt",ios::out |ios::in);
if(!writeFile)
{
cout<<"No File"<<endl;
}
else
{
writeFile.write(reinterpret_cast<const char *>
(&obj),sizeof(Person));
outFile.close();
}
return "Done";
}
答案 0 :(得分:1)
&#34;写的垃圾&#34;在输出文件中可能是由于这一行:
writeFile.write(reinterpret_cast<const char *>(&obj),sizeof(Person));
reinterpret_cast不会自动为您添加空格,这在逻辑上是运算符&gt;&gt;文件读取将基于以空格分隔的单词。
我想说,如果有更好的选择,reinterpret_cast应该永远是最后的选择。根据您现有的写入功能,我假设您更喜欢以文本模式而不是二进制文件来编写文件。
我会简单地使用以下机制:
string out_str = obj.getName() + " " + obj.getAddress() + " ";
writeFile.write(out_str.c_str(), out_str.size());
我会亲自逐行写出来,而不是逐字逐句。此外,如果名称和地址看起来不仅仅是一个单词,您将遇到问题,因此请注意这一点。