2012-08-11 5 views
0

바이너리 파일에서 SRD 객체의 배열을 읽었습니다. 처음으로 그렇게 했으므로 헤더를 수정하여 모든 구성원을 공용으로 만들었습니다. 계속해라. 과제를 완료했습니다. 남은 과제는이 멤버를 비공개로 만들고 수정하는 방법입니다. 그러나 문제가 있습니다. 디버깅 목적으로 나는 오직 1 명의 멤버 만 private으로 두었고, 모든 메소드를 작성할 때까지 그렇게 유지할 것입니다. 이 멤버는 부호없는 int C입니다. 반환하는 메서드를 작성할 때 (getC()는 C를 반환합니다) 값이 0000 ... 3435973836 인 값을 반환합니다. 즉 설정되지 않았습니까? 그래서 바이너리 파일의 객체 수에 따라 SRD에 대한 포인터 배열을 만들었습니다.바이너리 데이터에서 객체 읽기

SRD *a; 
... 
a = new SRD[numOfRecords]; 

및 배열은 파일에서 가득 ... 지금

for (i=0; i<numOfRecords; i++) 
    { 
     f.seekg(i * sizeof s); 
     f.read((char *)&a[i], sizeof s); 
     cout << a[i].getCC(); 
    } 

, a[i].getCC() 작품 C 공공이지만, 개인 차종이 000..3435 ... 의미가 접근하기 문제는 아니지만 이전 for 루프에서 fread로 설정되지 않았습니다. 이 값을 설정하는 할당 연산자의 일부 유형이 필요하다고 상상하지만, 단서가 없습니다.

답변

0

실제로 문제가 어떤 다른이었다 헤더가 특정 순서로 정의하고, 제 1 부재하던 배열, 반면 C는 두 번째, 그리고 디버깅 나는 처음 C와 함께 시작 - 그리고 위의 공개 위치로 두 번째 위치에서 이동, 클래스의 구조를 변경. 이진 파일의 데이터는 클래스 defenition의 순서를 재 배열, 구성원 (c) 시도 특정 순서를 보유하고 있기 때문에

그래서

Class P 
{ 
int i; 
char c; 
} 

Class P 
{ 
char c; 
int i; 
} 

상이 다른 회원 (i)에 대한 데이터에 액세스하려면

1

변수를 private로 설정하면 SRD 클래스가 더 이상 plain old data (POD)이 아닙니다. 결과적으로, 메모리 내 표현에 대한 보장이 없으므로 f.read에 의존하여 더 이상 이와 같이 작업 할 수 없습니다.

클래스 및 그 메서드 내부에서 read의 부호없는 int 멤버 변수에 직접 스트림 읽기 메서드를 추가하는 것이 좋습니다. 그런 다음 루프에서 해당 메소드를 호출 (스트림을 참조 또는 포인터로 전달)합니다. 요청한

EDIT 예 :

class SRD { 
    ... 
    public: 
    void readFromStream(istream& f) { 
     f.read(&CC, sizeof CC); 
    } 
    private: 
    unsigned int CC; 
}; 

루프 :

for (i=0; i<numOfRecords; i++) 
{ 
    a[i].readFromStream(f); 
    cout << a[i].getCC(); 
} 
+0

간단한 예제를 작성하려면 어떻게해야하나요? –

+0

예제가 추가되어 도움이되기를 바랍니다. – Reunanen

+0

실제로 문제는 다른 것이 었습니다. 헤더가 특정 순서로 정의되었고, 첫 번째 멤버는 배열이었고 C는 두 번째 였고 디버깅 중에는 C로 시작하여 두 번째 위치에서 공개적인 것보다 위에있는 것은 클래스의 구조를 변경했다. so, 클래스 P { int i; char c; } 은 과 다릅니다. 클래스 P { char c; int i; } 이진 파일의 데이터가 특정 순서를 가지며 클래스 정의의 순서를 재 배열 할 때 멤버 (c)가 다른 멤버 (i)에 대한 데이터에 액세스하려고 시도하므로, –

관련 문제