2012-01-08 3 views
2

허프만 인코더를 쓰려고하는데 압축 오류가 발생합니다. 문제점을 ofstream에 넣은 문자와 같은 파일의 read() 문자 사이의 불일치로 확인했습니다.넣어서 읽는 문자가 일치하지 않습니다.

이 문제의

하나의 특정 인스턴스 :

  • 풋()는 ASCII 문자 10 (라인 피드)
  • 읽기()를 읽고 쓰는 ASCII 문자 13 (캐리지 리턴)

나는 읽고 쓰고 생각하고 원시 데이터 (문자 번역 없음)를 쓰는 이유는 확실하지 않습니다. 누군가 나를 도울 수 있습니까? 여기

가 압축 된 파일 작성하기위한 ofstream 인스턴스입니다 : 같은

std::ifstream fileInput(getFileName()+".huf",std::ios::binary); 

코드를 읽는

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary||std::ios::ate); 

과 ifstream 인스턴스는 프로그램에 Windows 7 및 모든 스트림에서 실행 바이너리 모드로 열립니다.

+0

운영 체제 란 무엇입니까? –

+0

'ofstream' 인스턴스를 여는 코드를 게시 할 수 있습니까? – hmjd

+0

@ Mr.TAMER 저는 Windows 7에 있습니다 – angryInsomniac

답변

5

때문에 오타로 바이너리 모드로 개방되지 않음 :

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary||std::ios::ate) 

은 다음과 같아야합니다

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary|std::ios::ate) 
                     // ^

|하지 ||을.

+0

음 ... 나는 바보 같은 느낌이 들지 않습니다! :) – angryInsomniac

3

증상은 텍스트 모드를 사용하여 ofsteam을 만들거나 텍스트 모드에서 열리는 filedesc를 사용하여 만듭니다. 생성시 ios :: binary를 전달하거나 Windows에서 텍스트 모드로 실행할 수 있습니다.

코드를 추가하면 이유가 오타가됩니다.

std::ios::binary||std::ios::ate 

는 바이너리 데이터를 작성하는 경우, 적절한 속성을 가진 파일을 열 필요가 Windows에서

std::ios::binary|std::ios::ate 
0

해야한다.

마찬가지로 이진 데이터를 읽는 경우 적절한 특성을 사용하여 파일을 열어야합니다.

+0

내 모든 스트림은 바이너리 모드입니다. – angryInsomniac

+1

아니요 - 그렇지 않습니다. 또는 실제로 코드를 볼 수 없기 때문에 "두 바이너리 스트림 모두 매우 놀랍습니다."라고 말하십시오. 두 CR이 모두 LF 매핑으로 CR을 가져 오지는 않을 것입니다. 문제가 출력 스트림에있을 확률이 더 높습니다. Windows에서 텍스트 줄에 개행 문자를 넣었을 때 생성 된 CRLF의 CR을 보는 것처럼 보입니다.이 증상은 텍스트 스트림을 사용하여 바이너리 데이터를 작성하는 것과 정확히 같습니다. 출력 스트림과 입력 스트림을 여는 코드를 보여줄 수 있습니까? –

+0

질문에 코드를 넣었지만 hmjd가 지적한 오타가있는 것으로 보입니다.이를 수정하고 프로그램이 작동하는지 확인합니다. – angryInsomniac

관련 문제