C++;带字符串和浮点的文件IO 我正在学习C++中的一些文件IO。我创建了一个类person和两个函数write和read

C++;带字符串和浮点的文件IO 我正在学习C++中的一些文件IO。我创建了一个类person和两个函数write和read,c++,file-io,C++,File Io,它将正确写入文件,但当我想读取并用读取初始化个人对象时,它只会在第一次运行时起作用 我认为这与float age变量有关 #include <iostream> #include <fstream> #include <string> #include <sstream> #include <iomanip> using namespace std; class person{ public: person();

它将
正确写入
文件,但当我想
读取
并用
读取
初始化
个人
对象时,它只会在第一次运行时起作用

我认为这与
float age
变量有关

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>  

using namespace std;

class person{
public:
    person();
    person(string, string, float);

    string getName();
    string getAddress();
    float  getAge();

    void setName(string);
    void setAddress(string);
    void setAge(float);

    ~person();

private:    
    string name, address;
    float age;    
};

person::person(){
    //NOTHING TO DO.
}

person::person(string NAME, string ADD, float AGE) 
: name(NAME), address(ADD), age(AGE){
    //NOTHING TO DO.
}

string person::getName(){
    return name;
}
string person::getAddress(){
    return address;
}
float person::getAge(){
    return age;
}

void person::setName(string NAME){
    name = NAME;
}
void person::setAddress(string ADD){
    address = ADD;
}
void person::setAge(float AGE){
    age = AGE;
}

void write(person* pA[], int sz){
    ofstream myfile("people.txt", ios::trunc);
    for(int i = 0; i < sz; i++){
        myfile << pA[i]->getName()    << endl
                << pA[i]->getAddress() << endl
                 << fixed << setprecision(2)
                  << pA[i]->getAge()    << endl;
    }     
}
person* read(ifstream & myfile){
    person* p = new person();
    string name, address;
    float age;

    getline(myfile, name);
    getline(myfile, address);
    myfile >> age;

    p->setName(name);
    p->setAddress(address);
    p->setAge(age);

    return p;
}

int main() {
    person* p0 = new person("Edward Jones", "Los Angeles", 22.2);
    person* p1 = new person("Floyd Mayweather", "Las Vegas", 26);
    person* p2 = new person("Jane Doe", "Paris", -99);

    int sz = 3; //size of array.
    person* pA[3];

    pA[0] = p0;
    pA[1] = p1;
    pA[2] = p2;

    write(pA,sz);

    person* newP0;
    person* newP1;
    person* newP2;

    ifstream myfile("people.txt");

    newP0 = read(myfile);
    newP1 = read(myfile);
    newP2 = read(myfile);

    myfile.close();

    cout 
    << newP0->getName() << endl << newP0->getAddress() << endl << newP0->getAge()
    << newP1->getName() << endl << newP1->getAddress() << endl << newP1->getAge()
    << newP2->getName() << endl << newP2->getAddress() << endl << newP2->getAge();

    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
班主任{
公众:
人();
人(弦、弦、浮);
字符串getName();
字符串getAddress();
float getAge();
void setName(字符串);
无效设置地址(字符串);
空隙设置(浮动);
~person();
私人:
字符串名称、地址;
浮动年龄;
};
person::person(){
//无事可做。
}
person::person(字符串名称、字符串添加、浮动年龄)
:姓名、地址、年龄{
//无事可做。
}
字符串person::getName(){
返回名称;
}
字符串person::getAddress(){
回信地址;
}
float person::getAge(){
回归年龄;
}
void person::setName(字符串名称){
名称=名称;
}
void person::setAddress(字符串添加){
地址=添加;
}
无效人员::设置年龄(浮动年龄){
年龄=年龄;
}
无效写入(个人*pA[],内部sz){
流myfile(“people.txt”,ios::trunc);
对于(int i=0;igetName()因为此代码将
Person
的每个成员作为单独的一行写入,所以它也应该将其作为行读回

而不是:

myfile >> age;
做:



pA[2]=p2
写入了破坏堆栈的数组。

顺便说一句,您需要删除由
新的
操作员创建的
个人
s。是的,谢谢!这只是一个玩具应用程序,但这当然很重要。哦,我使用了
myfile>>age
因为我认为否则它不会保存浮点“格式”。我会尝试的!对arr也很抱歉是的,我又增加了一个人来看看发生了什么,显然没有对它进行测试。它起作用了。谢谢!添加了删除并调整了数组的大小以使其起作用。我感谢你的帮助。@DanielSegura你可能想使用
std::vector
来避免手动内存管理。我会研究一下的。再次感谢,我被困在那里了。
string age_str;
getline(myfile, age_str);
std::istringstream(age_str) >> age;
person* pA[2];
pA[0] = p0;
pA[1] = p1;
pA[2] = p2;