티스토리 뷰

 

8-9. 파일 쓰기/파일 읽기

힙 오버플로우와 스택 오버플로우

✔  heap 영역에서는 malloc()에 의해 메모리가 할당될수록, 점점 사용하는 메모리가 아래로 늘어난다.

✔  stack 영역에서는 함수가 호출될수록, 점점 사용하는 메모리가 위로 늘어난다.

✔  어느 순간 제한된 메모리 내에서 기존의 값을 서로 침범하는 상황이 발생할 수도 있다.

✔  이런 상황을 힙 오버플로우 또는 스택 오버플로우라고 말한다.

 

✔  컴퓨터가 너무 많은 메모리를 사용하면 파일이나 사진이 열리지 않거나 화면이 정지하거나 하는 상황이 발생한다.

✔  이런 상황은 버퍼 오버플로우라고 한다.

 

 

배열의 이름과 포인터
#include <stdio.h>

int main(void){    
    char *str = NULL;
    scanf("%s",str2);
    printf("%s\n", str2);
    
    return 0;
}

✔  배열은 메모리가 연속적으로 할당된 공간이며 문자열은 연속적인 문자의 집합이다.

✔  문자열(char *)의 주소는 사실 연속된 메모리 공간의 첫번째 주소를 의미

✔  따라서 포인터는 배열명과 같은 의미를 가지는 것을 알 수 있다.

✔  C언어의 컴파일러는 char 배열의 이름을 포인터처럼 다룬다.

 

 

파일 쓰기
#include <stdio.h>

int main(void){
  FILE *file = fopen("cs50/test.txt","a");
  fprintf(file,"%s\n","hello world");
  fclose(file);
  return 0;
}

✔  fopen이라는 함수를 사용해 실제 존재하는 파일을 FILE이라는 자료형으로 불러올 수 있다.

✔  fopen 함수의 첫 번째 인자는 파일 경로, 두 번째 인자는 파일을 사용하는 모드이다.

✔  모드는 r, w, a 가 있으며 각각 읽기(read), 새로 쓰기(write), 덧붙여쓰기(append) 를 의미한다.

✔  입력 값은 fprintf 함수를 사용해 printf 함수처럼 파일에 직접 내용을 출력할 수 있다.

✔  모든 작업이 끝난 후에는 fclose 함수를 사용해 반드시 파일에 대한 작업을 종료하자.

 

 

파일 읽기

✔  확장자가 JPEG의 경우,항상 0xff, 0xd8, 0xff 이 가장 먼저 저장된다.

✔  위의 3개의 값을 통해 입력받은 파일이 JPEG인지 확인해보자. (명령행 인자는 3주차 정리 참고)

#include <stdio.h>

int main(int argc, char *argv[])
{
  //명령행 인자로 파일명을 받지 않은 경우 강제종료
  if (argc != 2){
    return 1;
  }

  //명령행 인자로 받아온 파일명을 사용, read 모드로 파일 열기
  FILE *file = fopen(argv[1], "r");

  //만약 존재하지 않는 파일인 경우 강제종료
  if (file == NULL){
    return 1;
  }

  //컴퓨터는 색상을 Red, Green, Blue를 각각 256씩 표현하므로
  //unsigned를 사용해 표현 범위를 0~255로 설정하고 파일에서 3개의 값을 읽어온다.
  unsigned char bytes[3];
  fread(bytes, 3, 1, file);

  //확장자가 JPEG인 경우 가장 먼저 저장된 3개의 값은0xff,0xd8,0xff으로 약속되어있으므로
  //if문을 사용, 읽어온 3개의 값을 비교해 JPEG파일인지 확인하자
  if (bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff){
    printf("Maybe\n");
  }else{
    printf("No\n");
  }

  //파일은 항상 닫아줄것
  fclose(file);
  
  //정상종료
  return 0;
}

✔  이렇듯 파일의 포맷마다 정해진 형식을 File Signature (=Magic Number)라고 부른다.

✔  File Signature는 파일의 형식을 고유하게 식별하기위한 파일의 첫번째 비트이다.

✔  File Signature가 파일포맷의 앞쪽에 정해지면 header signiture, 뒤쪽에 정해지면 footer signiture이라고 부른다.

✔  [참고 : List of File Signature] en.wikipedia.org/wiki/List_of_file_signatures 

✔  [참고 : File Signature] en.wikipedia.org/wiki/File_signature

 

 

 

 

[출처] 부스트코스 | 모두를 위한 컴퓨터 과학(CS50 2019)

댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday