![[CS50] 메모리 - 파일 읽기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcioTEV%2FbtsH3mZTQho%2Fh2g6a42SGqRGUxg5MdNy2k%2Fimg.jpg)
이전 강의에서 파일에 데이터를 쓰는 프로그램을 작성했다면 이번 강의에서는 파일의 내용을 읽어서 해당 파일이 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;
}
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
을 리턴하기 때문에 이를 검사해서 파일을 제대로 열 수 있는지를 확인한다.
그렇지 않으면 오류 메시지를 출력하고 1을 리턴하며 프로그램을 종료한다.
FILE *file = fopen(argv[1], "r");
if (file == NULL)
{
fprintf(stderr, "Could not open file %s\n", argv[1]);
return 1;
}
파일이 잘 열렸다면 프로그램은 계속 진행된다.
unsigned char bytes[3];
fread(bytes, 3, 1, file);
먼저 크기가 3인 unsigned char
배열을 만들고 fread
함수를 이용해 파일에서 첫 3바이트를 읽어온다.
fread
함수의 각 인자는 (배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일)을 의미한다.
if (bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff)
{
printf("Maybe\n");
}
else
{
printf("No\n");
}
마지막으로 읽어들인 각 바이트가 각각 0xFF
, 0xD8
, 0xFF
인지 확인한다.
이는 JPEG 형식의 파일을 정의할 때 정해진 규칙으로 JPEG 파일의 시작 부분에 반드시 포함되어야 한다.
따라서 검사 후 해당 파일이 JPEG 파일인지 확인할 수 있다.
프로그램이 끝나기 전에 fclose
함수를 사용해 반드시 파일을 닫아야 한다.
References
모두를 위한 컴퓨터 과학 (CS50 2019)
부스트코스 무료 강의
www.boostcourse.org
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!