2012-05-15 5 views
3

출력용으로 VTK 데이터 유형을 사용합니다. 데이터가 점점 더 커지고 있기 때문에 ASCII로 작성하는 데 많은 시간이 걸리고 지금까지 해왔 던 작업입니다.ASCII 및 BINARY 데이터를 같은 파일에 동시에 작성하는 방법

이진 형식으로 변경해야하지만 파일에 이진 파일의 경우에도 ASCII로 작성해야하는 일부 헤더가 있습니다 (http://www.vtk.org/VTK/img/file-formats.pdf 참조). 이제

내가 바이너리 형식과 충분한 경험이없는 나의 첫 번째 시도가

ofstream asciiWriter(file_name.c_str()); 
ofstream binWriter(file_name.c_str(), ios::app | ios::binary); 

문제를 통해 두 개의 스트림을 열 수 있었다 출력이 무질서하게 될 것으로 보인다 및 asciiWriterbinWriter 올바른에 출력되지 않습니다이다 주문 및 그래서 내가 ParaView에서 내 파일을 후 처리 할 수 ​​없습니다. 내가 시도한 한가지는 헤더/데이터 쓰기로 끝났을 때마다 asciiWriter.flush()binWriter.flush()을 사용하는 것이었지만 그 역시 도움이되지 않습니다.

어떻게해야합니까?

추신 : 저는 VTK 패키지 자체를 사용하고 싶지 않습니다 ... 그 거대하고 코드 의존성을 추가합니다!

+1

ASCII *는 * 바이너리입니다. 질문은 무엇입니까? –

+1

내가 링크 된 PDF 파일의 일부를 읽었으며 문제가 무엇인지 알았습니다. 그렇습니다. 그들은 ASCII가 바이너리와 다른 것처럼 행동합니다. 그러나 그들이 당신을 속일 수있게하지 마라. 하나의 작가 ('ios :: binary'와 함께)를 사용하면 OK이다. –

+0

@MrLister 고마워요. 나는 혼란스러워서 그들이 본질적으로 다른 두 가지라고 생각했다. – GradGuy

답변

5

내가 알고있는 모든 최신 시스템에서 바이너리와 텍스트 파일 간의 유일한 차이점은 C 런타임 라이브러리에 의한 개행과 파일 끝 문자 처리입니다. 특히 * nix 시스템에서 텍스트 및 이진 파일은 정확히 동일하게 작동합니다. Windows에서 '\n'을 텍스트 파일에 쓰면 '\r' (CR) 다음에 '\n' (LF)이 실제 파일에 기록됩니다. "\r\n" 쌍을 읽는 것은 하나의 '\n'으로 나타납니다. 또한 Windows에서는 텍스트 파일에서 '\x1A' (Ctrl-Z, EOF)을 읽으면 파일 끝의 신호가 표시됩니다. 이진 파일은 변환없이 그대로 읽고 쓰여집니다.

문서를 읽는 중에 줄의 끝에 '\n' ("\r\n"이 아님)으로 지정되어 있음을 확인합니다. 이는 Windows에서도 바이너리 파일로 헤더를 읽고 쓰는 것이 올바른 방법임을 의미합니다.

이전 버전의 일부 시스템 (RSX-11 및 VMS)에는 디스크의 텍스트 파일과 크게 다른 바이너리 파일이 있습니다. 또한 OS에 직접 레코드 기반 파일과 색인 파일을 지원했습니다. 그러나 파일을 열 때 지정할 수있는 많은 인수를 처리하기 위해 open(), fopen() 등의 함수 (및 다른 언어의 해당 함수)를 수정했습니다. 이러한 시스템에서는 매번 올바른 파일 모드를 사용해야했습니다.