티스토리 뷰
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)
'Computer Science > CS50' 카테고리의 다른 글
[CS50 코칭스터디 2기] 끝났다🎉🎉 (0) | 2021.03.14 |
---|---|
[CS50 6주차] 자료구조 (0) | 2021.03.14 |
[CS50 5주차] 7. 메모리 교환, 스택, 힙 (0) | 2021.02.14 |
[CS50 5주차] 6. 메모리 할당과 해제 (0) | 2021.02.12 |
[CS50 5주차] 3-5. 문자열 (0) | 2021.02.12 |