본문 바로가기

Programming/C

C 언어 | 파일 쓰기와 읽기

학습 목표

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

 

사용자에게 입력받기

앞 포스팅에서 메모리 영역 중 스택은 함수 호출과 관련된 변수가 저장된다고 배웠다. 이는 이제껏 자주 사용했던 get_int()나 get_string과 같은 함수에서도 사용된다.

 

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를 사용합니다.

 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

'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