mwultong Blog ... 프로그래밍 / 계산기

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

 
Monday, November 13, 2006

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


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 스트링: 옵션, 파라미터




tag: cpp
C언어 | C/C++ (Visual C++)

3 Comments:
At January 4, 2012 at 11:03 AM, Blogger 페인터 said...

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

 
At October 15, 2018 at 7:16 AM, Blogger Unknown said...

감사합니다 감사합니다 감사합니다

 
At June 28, 2019 at 6:02 PM, Blogger rivmt said...

감사합니다.

 

<< Home RSS 2.0 feed

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