8) 파일 쓰기

오버플로우

memory

위 사진은 컴퓨터의 메모리 공간이다.

힙 영역에는 malloc으로 할당된 메모리의 데이터가 저장됩니다. 그리고 스택에는 프로그램 내의 함수와 관련된 것들이 저장된다.

힙 영역에서는 malloc 에 의해 메모리가 더 할당될수록, 점점 사용하는 메모리의 범위가 아래로 늘어난다.

마찬가지로 스택 영역에서도 함수가 더 많이 호출 될수록 사용하는 메모리의 범위가 점점 위로 늘어난다.

이렇게 점점 늘어나다 보면 제한된 메모리 용량 하에서는 기존의 값을 침범하는 상황이 발생한다.

이를 힙 오버플로우 또는 스택 오버플로우라고 일컫는다.


사용자에게 입력 받기

int x;
scanf("%i", &x);
char s[5];
scanf("%s", s);

scanf 함수는 사용자로부터 형식 지정자에 해당되는 값을 입력받아 저장하는 함수이다.

scanf는 x가 아닌 &x로 그 주소를 입력받는다.

반면 char 코드에서는 scanf에 그대로 s를 입력했다.

그 이유는 s를 크기가 5인 문자열, 즉 크기가 5인 char 자료형의 배열로 정의하였기 때문이다.

문자 배열의 이름은 포인터처럼 다뤄진다. 즉 scanf에 s라는 배열의 첫 바이트 주소를 넘겨주는 것이다.


파일 쓰기

아래는 사용자로부터 입력을 받아 파일에 저장하는 프로그램이다.

#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *file = fopen("phonebook.csv", "a");
char *name = get_string("Name: ");
char *number = get_string("Number: ");
fprintf(file, "%s,%s\n", name, number);
fclose(file);
}

fopen이라는 함수를 이용하면 파일을 FILE이라는 자료형으로 불러올 수 있다.

fopen 함수의 첫번째 인자는 파일의 이름, 두번째 인자는 모드로 r은 읽기, w는 쓰기, a는 덧붙이기를 의미한다.

사용자에게 name과 number라는 문자열을 입력 받고, 이를 fprintf 함수를 이용하여 printf에서처럼 파일에 직접 내용을 출력할 수 있다.

작업이 끝난 후에는 fclose함수로 파일에 대한 작업을 종료해줘야 한다.


note

written by Caution-Sun