CS 기초/메모리

[CS50] 파일 읽기

담크 2021. 8. 26. 16:34

어느덧 벌써 메모리 파트의 마지막인 파일 읽기입니다. 우리가 일상적으로 사용하는 파일은 텍스트, 이미지, 비디오 등 여러 가지 형식이 존재합니다. 각 파일에는 파일 형식을 알려주는 실마리들이 존재한다고 합니다. 만약 파일 형식이 JPEG의 경우 JPEG 파일 형식인지를 알려주는 실마리가 파일 값 속에 있습니다. 이번 포스팅에서는 그 실마리를 찾아보도록 하겠습니다.

 

우선 다음과 같이 파일을 읽어서 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("아마 JPEG..?");
    }
    else
    {
        printf("놉\n");
    }
    fclose(file);
}

여기서 main에 (int argc, char *argv[ ])에 대한 부분은 예전에 한번 설명한 적이 있습니다.

혹시 헷갈리시는 분들은

https://darmk.tistory.com/entry/CS50-%EB%AA%85%EB%A0%B9%ED%96%89-%EC%9D%B8%EC%9E%90?category=966397 

 

[CS50] 명령행 인자

명령행 인자란? 사용자가 명령행에서 명령을 실행할 때 해당 명령과 함께 지정하는 인자를 의미합니다. 지금까지 clang을 사용할 때 -o 옵션을 줘서 a.out이 아닌 사용자가 원하는 이름으로 파일을

darmk.tistory.com

여기를 참고해주세요

 

여기서 argc가 2가 아니라면 파일명이 입력되지 않거나 파일명 이외의 다른 인자가 입력된것이기 때문에 1을 리턴하고 프로그램을 종료시킵니다.

argc가 2라면 프로그램이 진행이 되는데

fopen을 사용해 파일명을 읽기모드(r)로 불러옵니다. 여기서 읽기에 실패할 경우 NULL을 반환하므로 마찬가지로 file이 NULL일 때 1을 리턴합니다.

여기서도 잘 열렸다면 프로그램이 계속 진행됩니다.

크기가 3인 문자배열을 만들고 fread(File + read)로 파일의 첫 3바이트를 읽어옵니다.

(fread(배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일명)입니다.)

여기서 중요한 게 bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff부분일텐데 무슨 뜻이냐면 처음에 설명했듯이 이 부분은 JPEG 파일 형식인지 알려주는 실마리로 0xff, 0xd8, 0xff는 항상 JPEG 파일의 시작점에 꼭 포함되어있어야 한다고 합니다.

따라서 이 부분들이 있으면 JPEG 파일인 거고 없다면 JPEG 파일이 아닌 게 됩니다.

실제로 JPEG 파일을 넣어서 테스트해봤는데 잘 동작하는 것을 확인할 수 있습니다.

JPEG 파일뿐 아니라 다른 형식의 파일들도 실마리가 되는 부분이 있는데 이를 파일 시그니쳐라고 부른다고 합니다.

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=gaegurijump&logNo=110186211008&parentCategoryNo=&categoryNo=42&viewDate=&isShowPopularPosts=true&from=search 

 

File Magic Number (파일 매직 넘버) = File Signature (파일 시그니처)

File Magic Number (파일 매직 넘버) = File Signature (파일 시그니처) 파일들은 각각 고유...

blog.naver.com

정리를 잘해주신 분이 있어서 같이 첨부합니다. 잠깐 봤는데 신기하고 재밌어요 ㅎㅎ 보실 분들은 참고하시면 됩니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 메모리' 카테고리의 다른 글

[CS50] 파일 쓰기  (0) 2021.08.25
[CS50] 메모리 교환, 스택, 힙  (0) 2021.08.24
[CS50] 문자열 복사  (0) 2021.08.22
[CS50] 문자열 비교  (0) 2021.08.21
[CS50] 문자열  (0) 2021.08.20