컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Previous Post Java/자바] 문자열 삭제, 일부 문자열만 지우기; Remove, Delete Strin...Linux/리눅스] 화면 캡처, 데스크탑 화면을 파일로 저장, 갈무리; Screen Cap...Linux/리눅스] 워드프로세서; 오픈 오피스 (OpenOffice) - Writer 스냅...Linux/리눅스] gedit; 메모장에 해당하는 간단한 텍스트 에디터; 지에디터 스냇샵Perl/펄] 숫자를 영어 스펠링으로 변환; 영어식으로 읽기; Number to Engli...HTML-CSS] 글자 테두리, 점선/색깔 테두리 태그와 스타일 속성; Word Borde...HTML-CSS] 이미지/사진에 스크롤바 붙여, 좁은 화면에 모두 표시하기; IMG Scr...Java/자바] split()에서 Tab(탭 문자) 구분자; 마침표를 구분 기호로서 분리Java/자바] split 메서드 사용법 예제; 문자열을 배열로 변환, String to ...울트라에디트] 버그 패치(핫픽스) 다운로드 주소; UltraEdit-32 Hotfix Do...

C언어] 이진파일 읽기; 바이너리 파일 읽기전용으로 열기; Open, Read Binary File

Monday, November 13, 2006

exe 나 jpg / gif 같은 이진파일은 텍스트 파일과는 다른 방식으로 처리해야 합니다. 왜냐하면 이진파일에는, 텍스트 파일에는 없는 0x00 등의 문자들이 들어 있기 때문입니다.

또한 예를 들어, 0x0A 라는 바이트를 텍스트 모드로 읽으면 "줄바꿈 문자"라는 특수한 의미로 인식되지만, 이진파일 모드에서는 어떠한 의미도 없습니다. 그냥 평범한 데이터일 뿐입니다.


이진파일 열어서 읽기 예제


파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // exit()

int main(void) {

  FILE *in;
  int ch;


  // test.bin 이라는 이진파일을 읽기 전용으로 열기
  if ( (in = fopen("test.bin", "rb")) == NULL ) {
    fputs("파일 열기 에러!", stderr);
    exit(1);
  }


  // 이진 파일, 1바이트씩 읽어, 헥사로 출력
  while ( (ch = fgetc(in)) != EOF ) {
    printf("%02X ", ch);
  }


  fclose(in); // 파일 닫기
  return 0;
}


fopen("test.bin", "rb") 로, 이진파일을 열 수 있습니다.

* "r" 은 읽기전용으로 열라는 뜻

* "b" 는 이진파일입니다. 따라서 "test.bin" 이라는 파일명의 이진파일을 읽기전용으로 열라는 뜻입니다.

fopen 함수가 파일 열기에 실패하면, NULL 을 반환합니다. 위의 경우 "test.bin" 이라는 파일이 없다면 NULL 을 반환합니다.



fgetc() 는 파일에서 1바이트를 읽어서 char 가 아닌 int 로 반환합니다. 에러가 나거나, 파일의 끝에 도달할 경우 EOF 를 반환합니다.


while ( (ch = fgetc(in)) != EOF )

이것은 fgetc() 함수로 1바이트씩 파일 끝까지 계속 읽으라는 뜻입니다. 즉 EOF 가 아닌 동안 루프를 계속 돌리라는 뜻입니다. "!=" 은 "==" 의 반대입니다.



printf("%02X ", ch);

이것은 fgetc() 함수가 읽은 바이트를 16진수로 변환하여 화면에 출력하라는 뜻.





실행 결과:

작은 이진파일을 아무거나 "test.bin"이라는 이름으로 카피해 놓고 위의 예제를 실행하면 그 파일의 내용을 읽어 16진수로 출력합니다. 다음과 같은 식입니다.
D:\Z>cl 0.cpp && 0.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:0.exe
0.obj
4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 E0 00 00 00 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68
69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E 20 69 6E
 20 44 4F 53 20 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 AF 59 C1 F4 EB 3
8 AF A7 EB 38 AF A7 EB 38 AF A7 68 30 F2 A7 E8 38 AF A7 EB 38 AE A7 DE 38 AF A7
EE 34 F0 A7 D0 38 AF A7 EE 34 A0 A7 E7 38 AF A7 EE 34 CF A7 E8 38 AF A7 EE 34 F5
 A7 EA 38 AF A7 52 69 63 68 EB 38 AF A7 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 00 00 00 50 45 00 00 4C 01 03 00 D2 34 55 45 00 00 00 00
00 00 00 00 E0 00 0F 01 0B 01 07 0A 00 60 00 00 00 40 00 00 00 00 00 00 01 11 00
 00 00 10 11 FF





▶▶ [C언어 예제] 텍스트 파일 읽기; 명령 프롬프트 화면에 파일 내용 출력; 도스 type 명령

▶▶ C언어] 이진파일 쓰기/바이너리 파일 만들기 예제; Make, Write Binary File

▶▶ [C언어] fopen() 함수의 mode 스트링: 옵션, 파라미터

☞ C/C++

1 Comments:
At 11:03 AM, Blogger 페인터 said...

좋은 자료감사합니다. 큰도움이 되었습니다(_ _)

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Categories
Previous Posts
Monthly Archives
Top