2013-05-10 3 views
-1

그래서 전체 파일을 메모리 (바이너리)로 읽는 C++ 프로그램을 작성하려고했습니다. 메모리 블록은 분명히 문자 배열입니다. 파일 읽기는 성공했지만 값을 반복 할 때 일부는 4294967295와 같이 바이트가 아닙니다.바이트 단위로 파일 바이트 읽기, 손상된 데이터를 제공

나는 실제로 모든 것을 검색했지만 시도했지만 아무런 효과가 없습니다. 파일 (텍스트)을 읽을 때이 문제가 발생하지 않는다는 것을 언급 할 필요가 있습니다.

char* XFile; 
ifstream::pos_type Size; 

bool LoadFile(string FileName) 
{ 
    cout << "Opening File: " << FileName << endl; 
    ifstream FS(FileName.c_str(),ios::in | ios::binary | ios::ate); 

    if (!FS.is_open()) 
     return false; 

    Size = FS.tellg(); 
    cout << "File Size: " << Size << " bytes" << endl; 
    XFile = new char[Size]; 
    FS.seekg(0, ios::beg); 
    FS.read(XFile,Size); 

    for (int i = 0; i < 100; i++) // This loop is to test the read bytes (for example purposes) 
     cout << static_cast<unsigned>(XFile[i]) << "\n"; 

    FS.close(); 

    return true; 
} 
+0

우분투 13.04와 g ++ 4.7을 사용하고 있습니다. –

+0

무엇이'sizeof (unsigned)'입니까? 저는 당신이 거기에 문자를 넣지 않는다고 생각합니다. – lcs

답변

1

의 조합 : 여기

코드입니다

char* XFile; 

static_cast<unsigned>(XFile[i]) 

XFile[i] 먼저 int 서명으로 변환하게됩니다, 다음으로 캐스팅 unsigned. 따라서 파일의 값이 127보다 크면 음의 정수 값이되며 매우 큰 양의 값으로 표시됩니다. 당신은 unsigned char *char *을 변경하고 문제를 해결하거나 두 단계로 캐스팅 할 수 있었다 :

이 값이 "다른 표현으로 데이터를 변환 할 때"손상되는의 경우입니다
static_cast<unsigned>(static_cast<unsigned char>(Xfile[i])) 

주 , 파일에서 실제로 읽은 데이터는 완벽합니다.

0

기본값 char은 부호가 있거나 부호가 없어도됩니다. 플랫폼에 명시 적으로 서명되어 있으며 static_cast<unsigned>은 음수를 큰 양수로 변환합니다. 버퍼로는 char 대신 unsigned char을 사용하십시오.