CS 기초/메모리

[CS50] 파일 쓰기

담크 2021. 8. 25. 22:59

지금까지는 get_string, get_int등 사용자에게 입력받는 함수를 cs50 라이브러리를 이용해서 사용했습니다. 그렇다면 라이브러리엔 이 함수가 어떻게 구현되어있을까요? 오늘은 이전 포스팅에서 배웠던 메모리 교환, 스택의 정의를 잘 생각해보고 이 함수를 구현해보고 파일에 출력하는 방법에 대해 공부해보도록 하겠습니다.

 

지난 포스팅에서 machine code, globals등 메모리 구조에 대해 간단하게 정리했었는데요

이런 그림으로 설명했었습니다.

그 중 heap영역에서는 malloc에 의해 메모리가 더 할당될수록 점점 사용하는 메모리의 범위가 더 아래로 늘어납니다.

마찬가지로 stack 영역에서는 함수가 많이 호출될수록 메모리의 범위가 더 위로 늘어나겠죠

이렇게 서로 점점 늘어나다 보면 제한된 메모리 용량에서 기존의 값을 침범하는 상황이 발생하게 되는데 이를 힙 오버플로우 또는 스택 오버플로우라고 부릅니다.

 

스택은 지금까지 많이 사용했던 get_int, get_string과 같은 함수에서도 많이 사용되는데

만약 이런 함수들을 직접 구현해본다면

get_int

#include <stdio.h>

int main(void)
{
    int x;
    printf("x: ");
    scanf("%i", &x);
    printf("x: %i\n", x);
}

get_string

#include <stdio.h>

int main(void)
{
    char s[5];
    printf("s: ");
    scanf("%s", s);
    printf("s: %s\n", s);
}

이런식의 코드가 될 것입니다.

여기서 scanf는 형식 지정자를 사용해 해당 값을 입력받아 저장하는 함수입니다.

int의 scanf는 &x를 써서 스택 영역 안에 x가 저장된 주소로 찾아가서 사용자가 입력한 값을 저장하도록 합니다.

string에서의 scanf는 s를 크기가 5인 char로 지정했기 때문에 그대로 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('파일의 이름', 'a : 덧붙이기', 'r : 읽기', 'w: 쓰기')를 의미합니다.

char로 name과 number를 지정해 이름과 번호를 문자열로 입력받고

fprintf(File + printf) 함수를 사용해서 파일에 직접 내용을 출력할 수 있게 합니다.

작업을 다 마친 후에는 fclose함수로 파일에 대한 작업을 종료해줍니다.

 

실제로 해본 결과 왼쪽 리스트에 phonebook.csv라는 파일이 만들어지고 그 안에 사용자가 입력한 값이 덮어쓰기 되어있는 것을 확인할 수 있었습니다.


 

출처

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

 

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

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

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