从文件中检索记录并分配给变量

时间:2014-05-03 16:20:30

标签: c++ file-io fstream

我创建了一个程序,它将对象写入文件(通过将其转换为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;
}

这是程序输出的内容:

enter image description here

这里似乎有什么问题?

感谢您的时间

编辑: -

我的人员类实施

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";

         }

1 个答案:

答案 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());

我会亲自逐行写出来,而不是逐字逐句。此外,如果名称和地址看起来不仅仅是一个单词,您将遇到问题,因此请注意这一点。