-
[메모리] 파일 쓰기Stage/Computer Science 2021. 6. 1. 11:18
학습 목표
사용자로부터 값을 입력받아 파일에 출력하는 프로그램을 작성할 수 있다.
1. 힙 오버플로우, 스택 오버플로우
- 힙 영역에서 계속 malloc을 호출하게 되면 화살표 방향(아래방향)으로 메모리를 계속 사용하게 된다.
- 스택 영역에서는 함수가 많이 호출되면 될수록 사용하는 메모리 범위가 점점 위로 늘어나게 된다.
- 이렇게 힙과 스택 영역에서 계속해서 늘어나다 보면 메모리 용량은 제한되어있기 때문에 두 메모리 영역이 어디선가 충돌하게 된다.
- 이 같은 현상을
힙 오버플로우
또는스택 오버플로우
라고 말한다.
2. 사용자에게 입력 받기
스택은 get_int, get_string 같은 함수에서도 사용된다.
get_int, get_string 함수를 직접 구현해보자.2.1 get_int
#include <stdio.h> int main(void) { int x; printf("x: "); scanf("%i", &x); printf("x: %i\n", x); }
- int x를 정의한 후에 scanf에 x가 아니라 &x로 주소를 입력해줬다.
- scanf 함수의 변수가 실제로 스택 영역 안에 x가 저장돼있는 주소로 찾아가서 사용자가 입력한 갑을 저장하도록 하기 위해서이다.
2.2 get_string
#include <stdio.h> int main(void) { char s[5]; printf("s: "); scanf("%s", s); printf("s: %s\n", s); }
- scanf함수에 &s가 아니라 s를 그대로 입력해줬다.
- s는 크기가 5인 char 자료형의 배열로 정의 했기 때문이다.
- clang 컴파일러는 문자 배열의 이름을 포인터처럼 다루기 때문에 scanf에 s라는 배열의 첫 바이트 주소를 넘겨주는 것이다.
2.3. scanf
- scanf 함수는 C언어의 표준 입력 함수로, 사용자로부터 다양한 데이터를 다양한 서식에 맞춰 입력 받을 수 있게 해준다.
scanf() 함수의 f는 formatted의 약자이며, 서식화된 입력을 받는다는 의미이다.
3. 파일 쓰기
사용자로부터 입력 받아서 파일에 저장하는 프로그램을 만들어보자.
#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은 reading 읽기, w는 writing 쓰기, a는 append 덧붙이기를 의미한다.
- printf처럼 fprintf 함수를 이용해서 파일에 직접 내용을 출력하자.
'Stage > Computer Science' 카테고리의 다른 글
[자료구조] malloc과 포인터 복습 (0) 2021.06.01 [메모리] 파일 읽기 (0) 2021.06.01 [메모리] 메모리 교환, 스택, 힙 (0) 2021.06.01 [메모리] 메모리 할당과 해제 (0) 2021.05.31 [메모리] 문자열 복사 (0) 2021.05.31