컴퓨터공학/메모리

파일 쓰기

도전하는일반인 2021. 9. 28. 13:40

들어가기 전에

get_int나 get_string처럼 사용자에게 입력을 받는 함수는 어떻게 구현되어 있었을까요? 앞서 배운 메모리 교환, 스택의 정의를 잘 복습한 후에 두 함수를 직접 구현해보고, 더 나아가서 파일에 출력해보는 방법도 알아 보겠습니다.

 

학습 목표

사용자로부터 값을 입력받아 파일에 출력하는 프로그램을 작성할 수 있습니다.

 

핵심 단어

  • scanf
  • fopen
  • fprintf
  • fclose

 

글로벌 영역에는 프로그램 안에서 저장된 전역 변수가 저장됩니다.

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

 

 

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

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

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

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

 

사용자에게 입력 받기

스택은 우리가 여태껏 많이 써왔던 get_int나 get_string 과 같은 함수에서도 사용됩니다.

만약 이런 함수들을 직접 구현한다면 아래와 같은 코드가 될 것입니다.

 

[get_int 코드]

 

[get_string 코드]

 

위 코드들에서 scanf라는 함수는 사용자로부터 형식 지정자에 해당되는 값을 입력받아 저장하는 함수입니다.

get_int 코드에서 int x를 정의한 후에 scanf에 s가 아닌 &s로 그 주소를 입력해주는 부분을 유의하기 바랍니다.

scanf 함수의 변수가 실제로 스택 영역 안에 s가 저장된 주소로 찾아가서 사용자가 입력한 값을 저장하도록 하기 위함입니다.

반면 get_string 코드에서는 scanf에 그대로 s를 입력해줬습니다.

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

clang 컴파일러는 문자 배열의 이름을 포인터처럼 다룹니다. 즉 scanf에 s라는 배열의 첫 바이트 주소를 넘겨주는 것이죠.

 

 

파일 쓰기

이제 사용자로부터 입력을 받아 파일에 저장하는 프로그램도 작성할 수 있습니다

 

 

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

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

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

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

 

 

생각해보기


get_long, get_float, get_char도 비슷한 방식으로 직접 구현할 수 있을까요?

 

나의 생각  : 같은 방식으로 할 수 있을 것 같다.

 

get_long() -> scanf("%li", &variable);

get_float() -> scanf("%f", &variable);

get_char() -> scanf("%c", &variable);

 

형식지정자만 맞춰주면 될 것 같다.

 

출처 : https://www.boostcourse.org/cs112/lecture/119034?isDesc=false 네이버커넥트재단

'컴퓨터공학 > 메모리' 카테고리의 다른 글

파일 읽기  (0) 2021.09.28
메모리 교환, 스택, 힙  (0) 2021.09.28
메모리 할당과 해제  (0) 2021.09.28
문자열복사  (0) 2021.09.24
문자열 비교  (0) 2021.09.24