2017-11-19 22 views
1

학교 프로젝트의 경우 특정 기능에서 BMP 형식 인 이진 파일의 픽셀을 읽습니다. pixels는 객체의 픽셀 유형의 2D 배열입니다. 여기서 목표는 픽셀의 X 행과 Y 열의 이진 파일을 읽는 것입니다. 그러나 각 픽셀 행 다음에 패딩이 있으며 calculatePadding() 함수를 사용하여 계산할 수 있습니다. 반환 값 형식은 unsigned입니다.ignore()를 사용하지 않고 이진 파일 (C++)을 읽을 때 N 바이트를 무시합니까?

우리가해야 할 일은 파일을 2 진수로 한 행씩 읽고 픽셀을 다른 변수에 저장하므로 각 행 다음에 패딩을 건너 뜁니다. 이것은 지금까지 내가 한 것입니다 :

for (int i = image.height - 1; i >= 0; i--) { 
    for (unsigned j = 0;j < image.width; j++) { 
     file.read((char*)&image.pixels[i][j], sizeof(Pixel)); 
    } 
    fichier.seekg(sizeof(calculatePadding(image)) + tellp() , ios::beg); 
} 

내 문제는 마지막 행 (마지막 닫기 괄호 앞)입니다. 커서의 현재 위치와 패딩에 필요한 크기를 추가하여 커서를 앞으로 설정해야한다는 것을 알고 있습니다. 그러나, 어떻게 서명되지 않은 및 streampos 추가 할 수 있습니까? 나는 내가해야하는 전환을 이해하지 못한다. ignore()를 사용할 수 없습니다.

도움 주셔서 감사합니다!

또한 사이드 노트에서 어떻게 '0'을 바이너리 파일에 쓸 수 있습니까? 다음 함수에서 이미지를 가져 와서 이진 파일에 쓰고 패딩이있는 곳에서 '0'을 바이너리에 넣어야합니다.

이것은 작동합니까?

int zero = 0; 
file.write((char*)&zero, sizeof(calculatePadding(image))); 
+0

패딩은 항상 4 바이트 미만입니다. 난 그냥 4 바이트 배열을 만들고 그것에 패딩을 읽어. 간단하고 쓰기도 같은 기술을 사용할 수 있습니다. –

+0

'크기'는 무엇입니까? –

답변

0

afaik streampos와 numbers를 합계/빼기위한 이식성있는 방법은 없습니다. 하지만 두 단계에서이를 달성 할 수있다 : (streampos)와 함께 처음에 1 세트의 상대 위치 (부호)와 현재 위치 2 세트 상대적인 위치

std::ofstream ofs; 
ofs.open("out.txt"); 
ofs<<"test string\n"; 
auto opos = ofs.tellp(); 
std::ifstream ifs; 
ifs.open("in.txt"); 
ifs.seekg(opos, std::ios::beg); 
ifs.seekg(10/* your additional offset*/, std::ios::cur); 

다른 가능성 - 합 streamoff가있는 streampos

ifs.seekg(opos + std::streamoff(10/* your additional offset*/), std::ios::beg); 

약 0. 하나 또는 여러 바이트 (문자)를 쓰는 데 put/write 메서드를 사용할 수 있습니다. 귀하의 접근 방식이 올바르지 않습니다. sizeof (int) 만 0이지만 크기가 클 수 있습니다. 비슷한 질문이 - How to write 'n' copies of a character to ostream like in python

0
sizeof(calculatePadding(image))//? 

sizeof 운영자가 확실히 잘못은. sizeof(n) 여기서 n은 항상 정수이며 운영 체제에 따라 대개 4 또는 8입니다.

이 경우의 패딩은 24 비트 비트 맵 (0,1,2,3)의 경우 0에서 4 바이트 사이이므로 image.width % 4과 같아야합니다.

int padding = calculatePadding(image); 
for (int i = image.height - 1; i >= 0; i--) { 
    for (unsigned j = 0;j < image.width; j++) { 
     file.read((char*)&image.pixels[i][j], sizeof(Pixel)); 
    } 
    file.seekg(padding, ios::cur); 
} 

출력 파일 사용에 패딩을 추가하려면 :

char buf[4]={0}; 
fileout.write(buf, padding); 

padding를 가정 한 것입니다 이것은 결코 동일하거나 4 이상, 이하 당신은 각 행을 읽은 후 많은 바이트를 건너 뛸 필요 0보다.