2009-08-05 4 views
2

이 질문에 이전에 here과 비슷한 질문을 던졌습니다. 다른 사용자의 의견에 따라파일에서 C++의 구조체 내의 구조체 배열을 읽음

SO, 내 질문 재 프레임 한 : 첫 번째 게시물에서

을, 나는 inData의 < <를 사용하여 struct.By와 배열로 파일에서 그쪽으로 데이터를 읽으려고했다 p [i]이고 >> p.fId 인 경우 데이터 파일의 값을 PersonId로 읽을 수있었습니다.

지금 나는 이것을 시도하려는 :

나는 멤버 함수를 사용하려면
struct PersonId 
{ 
    int fId; 
}; 

struct PersonData 
{ 
    public: 
     typedef PersonData* Ptr; 
     PersonData(); 
     PersonId fId; 
     istream& read(std::istream&); 
}; 

istream& PersonData::read(std::istream& is) 
{ 
    is >> fId; 
    return is; 
} 

istream& operator >> (istream& is, PersonData &p) 
{ 
    // is >> p.fId; 
    return p.read(is); 
} 

int main() 
{ 
    ifstream indata; // indata is like cin 
    int i; 
    indata.open("persons.txt", ios::in); // opens the file 

    if(!indata) 
    { // file couldn't be opened 
      cout << "Error: file could not be opened" << endl; 
      exit(1); 
    } 

    int n = 5; 

    PersonData* p; 
    p = (PersonData*) malloc (n * sizeof(PersonData)); 


    while (!indata.eof()) 
    { 
     indata >> p[i]; 
     i++; 
    } 

    for(i = 0; i < n; ++i) 
    { 
     cout << "PersonData [" << i << "] is " << p[i] << endl; 
    } 
    return 0; 
} 

실제로 PersonData에 의해 정의 된 구조로 값을 읽어 "읽기". 내 질문 :

  1. 어떻게 PersonData 구조체에 저장되어 PersonId 구조체에 파일에서 데이터를 읽어? PersonData 읽는 동안

  2. 은 [I], I는 갱신 된 값을 가진 구조체 PersonId을 참조한다.

내 질문에 대한 답변을 지금 보시겠습니까?

+0

1. 코드를 세 번째로 게시하고 질문이 표시되지 않습니다. 2. C++로 작성하는 경우 malloc을 사용하지 마십시오 (new 연산자를 재정의하거나 simillar를 수행하지 않는 한). p = new Persondata [n]이라고 써야합니다. 그리고 마지막에 삭제 [] p; 3. PersonId에 대한 연산자 >> 구현을 볼 수 없습니다 –

답변

1

좋아, 먼저 불평 :-) 너는 네가 원하는 것을 말한다. 당신은 당신이 어떻게 시도하는지 썼습니다. 큰. 나는 결과가 당신이 예상 한 것과 같지 않다고 생각합니다. 그러나 당신은 당신이 얻은 결과가 무엇이고 왜 당신이 그것에 대해 실망하는지에 관해서는 말하지 않았습니다. 내가 작성한 코드를 보면 컴파일되지 않아야합니다.

istream& PersonData::read(std::istream& is) 
{ 
    is >> fId; 
    return is; 
} 

내가 PersonId의 유형에 대해 정의 >> 어떤 연산자를 볼 수 있으며, FID 유형 PersonId이다 : 문제는 여기에있다. 내가 맞습니까? 아니면 연산자 >>가 어딘가에 정의되어 있고 질문에 붙여 넣지 않았습니까? 내 수정 구슬이 불분명 해. 내가 제대로 짐작 경우 이 솔루션은 데이브 갬블에 의해 주어진다 :

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

당신은 "아직 PersonData 액세스를 시도하는 오류를 받고"썼다. 나는이 시간에 Dave의 수정 구슬도 분명하지 않은 것 같은데, 그는 당신이 가지고있는 문제를 말할 수 없다. 나도 할 수있다. 당신은 우리에게 세부 사항을 제공하거나 더 나은 수정 구슬을 보내야한다. 어쩌면 당신은 그의 다른 충고를 놓쳤을 것입니다. "또한 p [i] .fId.fId.때때로 당신은 때때로 당신을 IStream을 쓰기, 그리고 - 당신은 결과적으로 표준 네임 스페이스의 멤버를 참조하지 않습니다 - "그것은 당신이

cout << "PersonData [" << i << "] is " << p[i].fId.fId << endl; 

또 다른 문제도있을 수 있습니다 작성해야하는 대신

cout << "PersonData [" << i << "] is " << p[i] << endl; 

를 쓰는 의미 std :: istream 쓰기, std :: endl 대신 endl 쓸 것입니다. 아마도 Koenig 조회 당신을 위해, 그것을 잘 작동하지 않을 수도 있지만 표준 추가 :: 접두사 (물론 이것은 당신의 문제가) 도움이 될 수 있습니다.

2

당신은이 :

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

누락 구조체 PersonId 후;

당신은 제대로 작동()이 읽기 내부 >>입니다 FID를 확인해야합니다. 또한

은 [I] .fId.fId P를 사용하도록 수정 COUT.

위대한 작품!

문체에 대해 이제는 C++로, malloc을 사용하지 말고, 새로운 것을 사용하고 더 나은 방법으로 std :: vector <>을 사용하십시오. 그러면 크기 조정이 처리됩니다.

+1

'Psionic'이라는 새로운 배지가 있어야합니다 - 아무런 질문도 공식화되지 않았을 때 대답을주었습니다 : –

+1

@tkpoec, 나는 몰라. 그리고 네, 질문을 묻는/프레임하는 동안 나는 비틀 거렸다. 이미 평론가 배지가 있어야합니다. P – vivekv80

+0

@ tkopec why thankyou. 당신은 24 번을 생각하고 있습니다. 예, 거의 재밌지 않습니까? 푸른. 헬렌. 자리. 하루 종일 갈 수있어. ;) –

관련 문제