1 분 소요

❄️ David Malan 교수의 모두를 위한 컴퓨터 과학(CS50 2019)을 바탕으로 정리한 내용입니다.


이전 강의에서 파일에 쓰는 프로그램을 작성 했다면, 이번 강의에서는 파일의 내용을 읽어서 파일의 형식이 JPEG 이미지인지를 검사하는 프로그램을 작성해보겠습니다.

#include <stdio.h>

int main(int argc, char *argv[])
{
  // 사용자가 인자를 두 개 주었는지 확인
  if (argc != 2)
  {
      return 1;
  }

  // 파일을 연다
  FILE *file = fopen(argv[1], "r");

  if (file == NULL)
  {
      return 1;
  }

  // 파일에서 3바이트를 읽어온다 (파일의 첫 24비트)
  unsigned char bytes[3];
  fread(bytes, 3, 1, file); // 배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일

  if (bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff)
  {
      printf("Maybe\n");
  }
  else
  {
      printf("No\n");
  }
  fclose(file);
}

위 코드에서 main 함수를 보면 사용자로부터 입력을 받는 것을 알 수 있습니다.
여기서는 파일의 이름을 입력으로 받을 예정입니다.

만약 argc가 2가 아니라면, 파일명이 입력되지 않았거나 파일명 외의 다른 인자가 입력되었기 때문에 1(오류)을 리턴하고 프로그램을 종료합니다.
만약 argc가 2라면 프로그램이 그대로 진행됩니다.

입력받은 파일명(argv[1])을 ‘읽기(r)’ 모드로 불러옵니다.
만약 파일이 제대로 열리지 않으면 fopen 함수는 NULL을 리턴하기 때문에 이를 검사해서 file을 제대로 쓸 수 있는지를 검사하고, 아니라면 역시 1(오류)를 리턴하고 프로그램을 종료합니다.
만약 파일이 잘 열렸다면, 프로그램이 계속 진행됩니다.

그 후 크기가 3인 문자 배열을 만들고, fread 함수를 이용해서 파일에서 첫 3바이트를 읽어옵니다.
fread 함수의 각 인자는 (배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일)을 의미합니다.

그리고 마지막으로 읽어들인 각 바이트가 각각 0xFF, 0xD8, 0xFF 인지를 확인합니다.
이는 JPEG 형식의 파일을 정의할 때 만든 약속으로, JPEG 파일의 시작점에 꼭 포함되어 있어야 합니다.
따라서 이를 검사하면 JPEG 파일인지를 확인할 수 있습니다.

참고로 위 코드를 실행하기 위해서는 아래처럼 하면 됩니다.

$ ./{filename} {filepath}
# ex) ./jpegTest src4/brian.jpg


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: