मैं सी ++ में कुछ फाइल आईओ सीख रहा हूं। मैंने एक class person और दो फ़ंक्शन write और read बनाए हैं।

यह write फ़ाइल में सही ढंग से है, लेकिन जब मैं read और person ऑब्जेक्ट्स को read के साथ प्रारंभ करना चाहता हूं तो यह केवल पहले रन में ही काम करेगा।

मुझे लगता है कि इसे 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;
}

मैं आपकी मदद की सराहना करता हूं, निश्चित रूप से यह आप में से अधिकांश के लिए एक कोड दुःस्वप्न जैसा दिखता है, मैं क्षमा चाहता हूं। मुझे पता है कि यह बहुत बुनियादी है।

धन्यवाद!

0
10110 19 मई 2017, 17:17
BTW आपको new ऑपरेटर द्वारा बनाए गए persons को हटाना होगा।
 – 
SomeDude
19 मई 2017, 17:23
हाँ धन्यवाद! यह सिर्फ एक खिलौना ऐप है लेकिन निश्चित रूप से यह महत्वपूर्ण है।
 – 
10110
19 मई 2017, 17:36

1 उत्तर

सबसे बढ़िया उत्तर

चूंकि यह कोड Person के प्रत्येक सदस्य को एक अलग लाइन के रूप में लिखता है, इसलिए इसे इसे वापस लाइनों के रूप में भी पढ़ना चाहिए।

के बजाए:

myfile >> age;

करना:

string age_str;
getline(myfile, age_str);
std::istringstream(age_str) >> age;

में

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

pA[2] = p2 स्टैक को दूषित करने वाली सरणी के आगे लिखता है।

0
Maxim Egorushkin 19 मई 2017, 17:31
ओह, मैंने myfile >> age का उपयोग किया क्योंकि मैंने सोचा था कि अन्यथा यह फ्लोट 'प्रारूप' को संरक्षित नहीं करेगा। मै कोशिश करूँगा! सरणी के बारे में भी खेद है, मैंने यह देखने के लिए एक और व्यक्ति जोड़ा कि क्या हुआ, स्पष्ट रूप से इसका परीक्षण नहीं किया।
 – 
10110
19 मई 2017, 17:34
यह काम किया धन्यवाद! हटाए गए को जोड़ा और इसे काम करने के लिए सरणी के आकार को समायोजित किया। तुम्हारी सहायता सराहनीय है।
 – 
10110
19 मई 2017, 17:46
आप मैन्युअल मेमोरी प्रबंधन से बचने के लिए std::vector<Person> का उपयोग करना पसंद कर सकते हैं।
 – 
Maxim Egorushkin
19 मई 2017, 17:46
मैं उस पर गौर करूंगा। दोबारा, धन्यवाद मैं वहां फंस गया था।
 – 
10110
19 मई 2017, 17:48