2017-05-19 9 views
0

C++でいくつかのファイルioを学習しています。私はclass personと2つの関数writereadを作成しました。文字列と浮動小数点を使用したC++ファイルIO

これは、ファイルに正しくwriteが、私はreadにしたいとreadpersonオブジェクトを初期化するとき、それは最初の実行で動作します。

変数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

ところで、 'new'演算子で作成された' person'を削除する必要があります。 – SomeDude

+0

はい、ありがとう!これは単なるおもちゃアプリですが、もちろん重要です。 –

答えて

0

このコードでは、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

ああ、私は 'myfile >> age'を使用しました。そうでなければ、浮動小数点の 'format'を節約できないと思ったからです。試してみます!また、配列について申し訳ありません、私は何が起こったかを見るためにもう一人加え、明らかにそれをテストしなかった。 –

+0

ありがとうございました!削除を追加し、アレイのサイズを調整して機能させました。私はあなたの助けに感謝します。 –

+0

@DanielSegura手動メモリ管理を避けるために 'std :: vector 'を使いたいかもしれません。 –

関連する問題