2017-05-19 2 views
0

C++에서 일부 파일 io를 배우고 있습니다. 나는 class person과 두 개의 함수 writeread을 만들었습니다.문자열 및 부동 소수점을 사용하는 C++ 파일 IO

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

BTW'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'를 사용했다. 그렇지 않으면 플로트 '형식'을 보존하지 않을 것이라고 생각했기 때문입니다. 나는 시도 할 것이다! 배열에 대해 미안해, 한 명 더 추가하여 어떤 일이 발생했는지, 분명히 테스트하지는 않았다. –

+0

감사했습니다! 삭제를 추가하고 배열의 크기를 조정하여 제대로 작동하도록했습니다. 도와 주셔서 감사합니다. –

+0

@DanielSegura 수동 메모리 관리를 피하려면'std :: vector '을 사용하는 것이 좋습니다. –