2017-09-29 1 views
-1

정수 값을 파일에 쓰고, 쓰여진 순서대로 정수를 읽고 표시하는 간단한 프로그램을 작성하려고합니다. 파일에 기록 된 정수는 {0,2, .... 18}입니다. 다음은 코드입니다.C++에서 이진 파일 읽기/쓰기

// Example program 
#include <iostream> 
#include <string> 
#include <sstream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    typedef unsigned int uint32_t; 
    // Write to file 
    std::ofstream osObj; 
    string filename = "testFile"; 
    osObj.open(filename.c_str(), std::ofstream::binary); 

    for (uint32_t i=0; i<10; ++i) 
    { 
     uint32_t a = i*2; 
     osObj.write(reinterpret_cast<const char *>(&a), sizeof(a)); 
     //osObj.write((char *)(&a), sizeof(a)); 
    } 

    //read from file 
    std::ifstream isObj; 
    isObj.open(filename.c_str(), std::ofstream::binary); 
    if (isObj.fail()) { cout<<"Failed to open file"<<endl; } 

    for (uint32_t i=0; i<10; ++i) 
    { 
     char val[sizeof(uint32_t)]; 
     isObj.read(val, sizeof(val)); 
     uint32_t* valUint = reinterpret_cast<uint32_t *>(val); 
     cout<<*(valUint)<<endl; 
    } 
    return 0; 
} 

예상되는 결과가 나오지 않습니다. 다음 출력을 얻고 있습니다 :

62586880 
62586880 
62586880 
62586880 
62586880 
62586880 
62586880 
62586880 
62586880 
62586880 

바이트 순서는 리틀 엔디안입니다. 내가 뭘 놓치고 있니?

+2

당신이 무엇을 기대하고 무엇을 얻고 있는지에 대한 설명이 없습니다. – Slava

+0

@Slava가 질문을 편집했습니다. – Naveen

+0

읽기 루프는 쓰기 루프와 모양이 같을 수 있으며 'uint32_t a; osObj.read (reinterpret_cast (& a), sizeof (a)); cout << a << endl; – NathanOliver

답변

1

ivalUint을 입력하면 안됩니다. 하나의 정수를 val으로 읽어 들이기 때문에, 방금 읽은 정수는 valUint이 가리키는 주소에 있습니다. 정수 배열이 아니므로 포인터를 인덱싱 할 이유가 없습니다.

cout<< *valUint << endl; 

를 작성하는 간단한 방법은 다음과 같습니다 또한

for (unint32_t i = 0; i < 10; ++i) { 
    uint32_t val; 
    isObj.read(reinterpret_cast<char *>&val, sizeof val); 
    cout << val << endl; 
} 

, 당신은 쓰기 루프의 끝에서 osObj.close()을 수행해야합니다. 파일이 버퍼링되고 버퍼가 플러시되지 않았을 수 있습니다. 읽을 때 오류를 확인했다면 파일에서 아무것도 읽지 못했을 것입니다.

+0

좋은 캐치. 그러나 이것은 올바른 정수를 반환합니다. – Naveen

+1

파일을 쓰거나 읽는 사이에 파일을 닫아야합니다. – Barmar

+0

예, 파일을 닫는 것이 트릭입니다. 고맙습니다! – Naveen