학습 목표
사용자로부터 값을 입력받아 파일에 출력하는 프로그램을 작성할 수 있다.
사용자에게 입력받기
앞 포스팅에서 메모리 영역 중 스택은 함수 호출과 관련된 변수가 저장된다고 배웠다. 이는 이제껏 자주 사용했던 get_int()나 get_string과 같은 함수에서도 사용된다.
get_int()와 get_string() 함수를 직접 구현해보자.
코드를 살펴보자.
- line 7을 보면 scanf() 함수가 쓰인 것을 확인할 수 있다.
- scanf() 함수는 사용자로부터 형식 지정자에 해당하는 값을 받고 저장한다.
- 실제 스택 영역 안에 변수가 저장된 주소로 찾아가야 하기 때문에 x가 아닌 &x라 입력한다.
- get_string() 함수를 구현한 경우 s를 배열로 정의했기 때문에 그대로 s를 입력해 첫 바이트의 주소를 넘긴다.
파일 쓰기
사용자로부터 입력을 받아 파일에 저장하는 프로그램을 작성해보자.
코드를 살펴보자
- fopen() 함수를 사용하면 파일을 FILE 자료형으로 불러올 수 있다.
- fopen() 함수의 첫 번째 인자는 파일의 이름이다.
- 두 번째 인자의 모드로는 r(읽기), w(쓰기), a(덧붙이기)가 있다.
- line 8, 9에서 사용자로부터 문자열을 입력받는다.
- line 10에서 fprintf() 함수를 이용하여 printf에서 처럼 파일에 내용을 출력한다.
- file 작업이 끝나면 fclose() 함수로 종료해주어야 한다.
생성된 phonebook.csv를 열어보면 입력한 정보를 확인할 수 있다.
파일 읽기
파일의 이름을 입력받아 파일의 형식을 검사하는 프로그램을 작성해보자.
main 함수에서 파일의 이름을 입력받아 형식이 JPEG 이미지인지 검사하는 프로그램이다. 코드를 살펴보자.
- 만약 argc가 2가 아니라면 파일명이 입력되지 않았거나 파일명 외의 다른 인자라는 뜻이니 1(오류)을 리턴하고 프로그램을 종료한다(line 5).
- 만약 argc가 2라면 입력받은 파일 argv[1]를 읽기 모드(r)로 불러온다(line 10).
- 파일이 제대로 열리지 않으면 NULL을 리턴할 것이니 이에 대한 종료 조건문도 만든다(line 12).
- 파일이 열렸다면 크기가 3인 문자 배열을 만들고 fread() 함수로 파일의 첫 3바이트를 읽어온다.
- fread() 함수의 각 인자는 (배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일)을 의미한다.
- 읽어 들인 각 바이트가 각각 0xFF, 0xD8, 0xFF인지 확인한다. 이는 JPEG 형식 파일의 시그니처이다.
이미지 2개를 다운로드하여 프로그램을 실행한 결과다.
이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.
'Programming > C' 카테고리의 다른 글
C 언어 | 배열의 크기 조정하기 (0) | 2021.02.26 |
---|---|
C 언어 | malloc과 포인터 (0) | 2021.02.26 |
C 언어 | 메모리 교환, 스택, 힙 (0) | 2021.02.22 |
C 언어 | 메모리 할당과 해제 (0) | 2021.02.22 |
C 언어 | 문자열의 복사 (0) | 2021.02.20 |