2012-12-24 5 views
2

안녕하세요! 파일의 처음 4 바이트를 읽고 정수 변수에 저장하려고합니다. 여기에 내가 뭘 내용은 다음과 같습니다파일에서 짧은/긴 정수로 바이트 읽기

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <cstring> 

using namespace std; 

int main(){ 
    ifstream is; 
    is.open ("binary_file.dat", ios::binary); 
    char file_version[4]; 
    is.read(file_version, 4); 
    int fv_int; 
    memcpy(&fv_int, file_version, sizeof(fv_int)); 
    cout << fv_int; 
} 

그러나 결과는 나는 그것이 될 운명이되지 것입니다. 프로그램은 파일의 첫 번째 바이트를 올바른 위치에 복사하지만 나머지 바이트는 0으로 간주합니다. 예 : 내 파일의

첫 번째 4 바이트 :

10101010 00101100 00101100 00101100 

프로그램 실행 후 fv_int의 내용에 무엇입니까 :

10101010 00000000 00000000 00000000 

특정 바이트 정수에 액세스 할 수있는 방법이 있나요이? 아니면 파일에서 바이트를 읽는 더 나은 방법?

+0

단지'is.read (& fv_int, 4);'할 수 없습니까? 또한, 왜'int'가 4 바이트 길이라고 가정합니까? –

+1

int 값은 플랫폼에 따라 다르므로 int 대신 int32_t (stdint.h에서)를 사용해야합니다. 이것은 아마도 문제를 해결하지는 못하지만 코드를 더 이식성있게 만듭니다. –

+0

@ H2CO3 : C++ std :: istream :: read()는 char에 대한 포인터를 사용합니다. 슬프지만 사실이야. –

답변

2

istream :: read는 정확히 4 바이트를 읽지 않으며 읽은 바이트 수를 반환합니다. 당신은 내가 처음 4 바이트가 파일 프로그램을 공급하면 상세에게

+0

내 파일이 200kBytes이므로 너무 짧지는 않습니다. P 함수가 * this를 반환합니다. <- C++ refference :( – kosto

+0

오, 죄송합니다. readsome'은 number =를 반환합니다.) 검사 오류가 있습니다. 같은 것을 추가하십시오. if (! is) cout << ""error " – kassak

+0

또는 예외를 제거하십시오. http://www.cplusplus.com/reference/ios/ios/exceptions/ – kassak

1

를 코드의 양을 줄이고 추가 is.read(reinterpret_cast<char*>(&fv_int), size_of(fv_int));을 할 수있는, 그것은 읽 반환 값을 확인, 파일은

추가 힌트 너무 짧은 수 있습니다 &은 완벽하게 표시합니다. 추가 진단을 위해 마지막 인용 부호를 다음과 같이 변경하십시오 : cout <<sizeof(int)<<" "<<hex<<fv_int<<endl;

+0

이상하게도 16 진수 편집기에서 확인하고 있습니다. , 그리고 그것이 제대로 작동하지 않을 것이라고 확신합니다. – kosto

+0

'hexdump -C binary_file.dat'는'00000000 f0 f1 f2 f3 ...'을 주었고 (cout이 변경된) 프로그램은 나에게'4 f3f2f1f0'을 주었다. 왜냐하면 나는 인텔 프로세서를 사용하고 있기 때문에 정확하다. – pbhd

+0

아 16 진수 편집기를 오해 한 것처럼 보입니다. 당신은 옳습니다, 코드는 작동합니다. 모두에게 감사드립니다. – kosto