2016-09-16 8 views
0

이진 파일을 클래스 변수로 읽으려는 중입니다. 정수는 올바르게 읽고 표시되지만 이중 값은 이상한 값을 갖습니다. 나는 여기서 무슨 일이 일어나고 있는지 확신하지 못한다. 명령 윈도우의 출력은 다음과 같습니다 다른 형식의 변수를 이진 파일에 쓰고 클래스 변수로 읽는 중 잘못된 값이 나타난다

98 
366 
7 
-9.25596e+61 

내 코드입니다 : 컴파일러가 패드 사용자 struct에 허용

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <vector> 

class text 
{ 
private: 
    int var1, var2, var3; 
    double var4; 
public: 
    int getVar1() { return var1; } 
    int getVar2() { return var2; } 
    int getVar3() { return var3; } 
    double getVar4() { return var4; } 
}; 

using namespace std; 

int main() 
{ 
    // Create test binary file 
    FILE* file = fopen("D:\\Desktop\\TestFile", "wb"); 

    // Define test variables 
    int var1 = 98, var2 = 366, var3 = 7; 
    double var4 = 52.13; 

    // Write test variables to file 
    fwrite(&var1, sizeof(var1), 1, file); 
    fwrite(&var2, sizeof(var2), 1, file); 
    fwrite(&var3, sizeof(var3), 1, file); 
    fwrite(&var4, sizeof(var4), 1, file); 

    fclose(file); 

    // Read from file into class 
    FILE* input; 
    input = fopen("D:\\Desktop\\TestFile", "rb"); 
    text t; 
    fread(&t, sizeof(t), 1, input); 

    cout << t.getVar1() << endl << t.getVar2() << endl << t.getVar3() << endl << t.getVar4() << endl; 

    fclose(input); 

    return 0; 
} 
+1

'text'의 변수를 직접 읽어보십시오. 't'의 크기는 반드시 모든 멤버 변수의 크기의 합계와 같을 필요는 없습니다. – AndyG

+0

'text' 클래스의 멤버는 그 사이에 패딩을 가질 수 있습니다. 개별 멤버를 작성할 때 패딩을 쓰지 않으므로 전체 클래스를 읽으려고하면 패딩 바이트를 건너 뛰지 않습니다. – Barmar

+1

당신은 파일에서 쓴 것과 같은 것을 읽지 않습니다. 3 개의 int와 double을 쓰지 만'text' 객체를 읽으려고합니다. 쓰기 및 읽기 대칭을 시도하십시오 – user463035818

답변

1

하고,이 경우에 수행 : 여기

에 대한 테스트입니다 3 정수 + 2 배 크기의 크기와 text (demo) 인스턴스의 크기를 인쇄하십시오.

class text 
{ 
private: 
int var1, var2, var3; 
double var4; 
public: 
int getVar1() { return var1; } 
int getVar2() { return var2; } 
int getVar3() { return var3; } 
double getVar4() { return var4; } 
}; 

int main() 
{ 
    std::cout << sizeof(int) + sizeof(int) + sizeof(int) + sizeof(double) << " versus " << sizeof(text) << std::endl; 
} 
,

출력 :

20

컴파일러가 일을 맞 춥니 다 좋아 (와 달리 지정하지 않는 한 그렇게 할 무료입니다) 때문에 발생 24 대.

대신, 나는 당신이, text>> 연산자를 오버로드 직접 멤버로는 C++를 사용하고 있기 때문에 std::ifstreamstd::ofstream를 사용, 읽기 좋습니다.

+2

imho 모두가 C++에 대해 배워야 할 첫 번째 물건 중 하나입니다. 그것은 내가 실제로 얼마나 쉽게 읽기/객체에 /과 출력 연산자를 오버로드 된 파일을 작성하는 것입니다 깨닫게 때 내 눈을 openers 중 (diletantish의 C/O를 C++로 속이는 년 후) – user463035818