2013-04-01 4 views
0

숙제를 위해 나는 간단한 길이의 인코딩을 사용하는 간단한 압축/압축 풀기 프로그램을 만들었다. 나는 내 프로그램을 작동시켰다. 매우 많은 문자 (예 : 프로그램 소스)로 텍스트 파일을 압축하고 압축을 풀면 완벽하게 작동합니다. 실험으로 압축 프로그램 자체의 이진 압축/압축 해제를 시도했습니다. 이로 인해 원래의 바이너리보다 훨씬 작은 파일이 생성되어 분명히 실행 가능하지 않게되었습니다. 이 데이터 손실의 원인은 무엇입니까?C 바이너리 파일 표현

내 가정은 바이너리 파일이 어떻게 표시되는지에 관한 것이었지만 과거에는 그다지 알 수 없었습니다.

+2

당신이 파일을 여는 버그 바이너리 모드? – NPE

+0

이진 파일은 형식이없는 1의 스트림이고 0의 –

+0

@NPE 아니요. 내 프로그램은 단지 getchar()을 사용하여 입력에서 읽습니다. 이 파일에서 비트를 잡아서 정수 값을 반환하지 않습니까? – grimetime

답변

3

가능한 문제 :

  • 프로그램이 텍스트 모드에서 이진 파일을 여는 손상 '\r''\n' 바이트 프로그램이 잘못 문자열의 끝으로 그들을 치료, 0 바이트를 처리
  • ( '\0') 자신의 데이터가 아닙니다.
  • 프로그램에서 데이터 바이트에 대해 char (실제로는 signed char)을 사용하고 영어 텍스트의 ASCII 문자는 있지만 음수가 아닌 값과 올바르게 작동하지만 wi
  • 프로그램이 곳에서만 큰 파일에 나타나있는 오버 플로우를 가지고 음수가 될 수 있습니다 임의의 문자/바이트 값을, 토륨
  • 귀하의 프로그램이 다른 데이터에 의존
+0

리눅스 바이너리 및 텍스트 모드는 동일합니다 .... –

+0

@BasileStarynkevitch 그건 돌이 설정되지 않았습니다. 우리는 어떤 컴파일러가 사용되는지는 알려주지 않았다. –

+0

텍스트 모드 대 바이너리 모드의 처리는 컴파일러에 의존하지 않습니다. 이것은 표준 라이브러리 ('libc' 또는'libstdC++')에 의해 수행됩니다; 리눅스에서는 바이너리와 텍스트를 모두 처리합니다. EOL. –

1

플랫폼이 Linux 인 경우 (질문에 태그가 추가 된 것처럼) 바이너리와 텍스트 모드간에 차이가 없습니다. 그래서 그렇게해서는 안됩니다. 그렇더라도 파일은 바이너리로 열어야합니다.

문제는 프로그램이 유효한 데이터 대신 '\ 0'문자를 종결 자 (또는 특별히 특수 문자)로 취급하는 것으로 의심됩니다.