2017-09-14 6 views
0

저는 CS202 클래스 용 프로젝트를 진행하고 있습니다. 나는 data.dat이라고 불리는 알려지지 않은 크기의 제공된 바이너리 파일을 가지고 있으며 파일에서 정수를 읽어서 (적절한 크기의 벡터에 저장해야합니다.) filestream에 fstream()을 사용해야하고 변환을 위해 reinterpret_cast<char *>()을 사용해야합니다.fstream을 사용하여 이진 파일에서 읽고 결과를 벡터에 저장하십시오.

fstream filestream2; 
//reading binary data from supplied data.dat file 
filestream2.open("data.dat", ios::in | ios::binary); 
vector<int> v; 
filestream2.seekg(0, filestream2.end); 
long length = filestream2.tellg(); 
v.resize(length); 
filestream2.read(reinterpret_cast<char *>(&v[0]), length); 
for(int num = 0; num < length; num++) 
{ 
    cout << v[num] << " "; 
} 

이론으로, 벡터, 파일에서 모든 정수를 개최 stdout에이를 인쇄해야하지만 내 출력은 단순히 약 50,000, 0 내가 상대적 해요 program exited with exit code 0 다음이다 : 내 코드는 다음과 같습니다 C++ 구문과 라이브러리에 익숙하지 않아서 나 자신의 삶에 대해 내가 잘못하고있는 것을 파악할 수 없다. 미리 감사드립니다. 당신이

filestream2.seekg(0, filestream2.end); 
long length = filestream2.tellg(); 

를 사용하는 경우

답변

2

당신은 벡터의 항목 수가 아니라, 파일의 문자 수를 얻을. 결과적으로 벡터 크기를 사용하려면 length/sizeof(int)을 사용해야합니다.

v.resize(length); 

올바르지 않습니다. 그것은

v.resize(length/sizeof(int)); 

for(int num = 0; num < length; num++) 
{ 
    cout << v[num] << " "; 
} 

가 부정확 할 필요가있다. 그것은 당신이 파일에 저장되는 데이터의 종류 (데이터의 크기) "사전에 모른다"고 말했다

for(int num = 0; num < length/sizeof(int); num++) 
{ 
    cout << v[num] << " "; 
} 
0

할 필요가있다. 주요 문제는 데이터의 크기와 데이터 유형을 확인하는 것입니다. 그래서 당신이 할 수있는, 사용자 정의 formate 파일을 만듭니다.

예 :

    파일의
  • 1 바이트 데이터의 유형을 표시합니다 (예를. I를 정수에 대해, F를 플로트를 들어, U 부호없는 INT를 들어, C 문자를 들면, S 등의 char * (문자열)에 대한)
  • 다음 4 바이트는 데이터 크기입니다 (char *에만 필요하므로 선택적 임)
  • 실제 날짜가 시작됩니다. 데이터가

    Cabcdefghijk 
    

    여기에 1 바이트와 같은 파일에있을 것입니다

그래서 데이터를 문자 수 있도록 C이다. 그래서 문자 유형의 벡터를 생성해야합니다.

다음 데이터 크기 :

fstream.seekg(0, fstream.end); 
long length = fstream.tellg(); // length : 12 

length -= 1; // 1st byte is indecator // length : 11 

// length -= 4; // Optional : if you had write size of data 
length = length/sizeof(char); // sizeof(int) or sizeof(flot) or written in file. 
// so in our case length will be 11; 

은 이제 데이터 유형과 데이터의 크기가 있으므로 적절하게 벡터를 만들거나 크기를 조정합니다.