[C]파일입출력 함수(1)[stream, fopen, fclose]


이 포스트는 고수준 파일입출력 함수에 관한 포스트입니다.


< 목차 >

1.   스트림(stream)
2.   fopen함수
3.   fclose함수
4.   fread함수
5.   fwrite함수
6.   스트림 표시자
7.   stderr(에러출력 스트림)


< C에서 파일다루기 >

  1. C에는 C#처럼 파일내용을 한번에 읽어와서 문자열 배열로 반환하는 등의 함수가 없습니다.
  2. 파일을 복사하는 함수도 없습니다.
    • 각 운영체제에서 제공하는 함수를 사용해야합니다.
    • 혹은 기능을 직접 스트림 읽기/쓰기 함수를 사용해서 구현해야 합니다.

1️⃣ 스트림(stream)

stream은 서로다른 객체들을 이어주는 다리와 같은 역할을 합니다. 그렇기 때문에 파일을 다루기 위해서는 stream을 다룰줄 알아야합니다.

< 표준 스트림(standard stream) >

stream기능장치
stdin표준 입력키보드
stdout표준 출력화면
stderr표준 에러화면

위와 같은 표준 스트림은 콘솔 입출력을 위한 스트림이며 프로그램이 실행되면 자동 생성되고 프로그램이 종료되면 자동으로 소멸합니다. 대표적으로 printf함수는 stdout(출력 스트림)의 형식으로 동작하기 때문에 화면에 바로 표시될 수 있고 scanf함수는 stdin(입력 스트림)의 형식으로 동작하기 때문에 키보드로 입력이 가능했습니다.
콘솔 스트림뿐만아니라 파일에도 스트림을 지정할 수 있는데 콘솔 스트림은 자동으로 소멸하는 반면 파일을 위한 스트림은 직접 생성과 소멸을 관리해야 합니다. 대표적으로 파일스트림을 생성하는 fopen함수와 소멸을 관리하는 fclose함수에 대해 알아 보겠습니다.


2️⃣ fopen함수

< 함수원형 >

FILE *fopen(const char* Filename, char *mode);
  • 첫번째 인자인 Filename“test.txt”처럼 읽어들일 파일이름을 ""로 처리하여 넣어주면 됩니다.
  • 두번째 인자인 mode는 아래에 표에서 선택해서 사용하면 됩니다.
  • 파일을 여는데 실패할시 NULL포인터가 반환됩니다.

< mode >

mode설명파일이 이미 있다면파일이 없다면
“r”(read)
파일을 읽기 전용으로 연다
파일의 첫부분부터 읽는다열기에 실패
“w”(write)
파일을 쓰기 전용으로 생성
파일의 내용을 모두 없앤다새 파일을 생성
“a”(append)
파일에 이어 쓴다
파일의 끝부분부터 읽는다새 파일을 생성
“r+”(read extended)
읽기/쓰기용으로 파일을 연다
파일의 첫부분부터 읽는다오류
“w+”(write extended)
읽기/쓰기용으로 파일을 생성한다
파일의 내용을 모두 없앤다새 파일을 생성
“a+”(append extended)
읽기/쓰기용으로 파일을 연다
파일의 끝부분부터 읽는다새 파일을 생성한다
  • 위의 mode기호에서 b 혹은 +b를 추가하면 이진모드(바이너리)로 파일을 열 수 있습니다.
모드‘\n’읽을때‘\r\n’읽을때‘\r\n’쓸때‘\n’쓸때
텍스트 모드‘\n’‘\n’‘\r\n’‘\r\n’
이진 모드(“b”)‘\n’‘\r\n’‘\r\n’‘\n’
  • 이진 모드는 위의 경우처럼 개행문자처리에 관련된 모드입니다.
  • '\r' (Carriage return)은 그 줄 맨 앞으로 가는 문자입니다.
    '\n' (Line feed)는 다음 줄로 가는 문자입니다. 다음 줄로 가는 것다음 줄의 맨 앞으로 가는 것은 분명 다른 것이고 특히, 프린터기로 출력하는데 있어서 중요한 처리입니다.
  • 하지만 요즘 거의 대부분 시스템의 컴파일러 들은 '\n'만으로 다음줄 처음으로 이동하게 처리되어 있습니다.

3️⃣ fclose함수

< 함수원형 >

int fclose(FILE *stream);
  • 파일이 성공적으로 닫히면 0을 실패하면 EOF(-1)을 반환합니다.
  • C언어에서는 자동으로 파일스트림을 닫아주지 않기 때문에 스트림사용 후에 꼭 fclose함수를 사용해서 닫아주어야 합니다.

< 함수사용 >

int main(void)
{
    FILE *stream;

    stream = fopen("test.txt", "r");
    /*
    코드생략
    */
    fclose(stream); //꼭 stream을 닫아주어야 합니다.
}



다음포스트 > [C]파일입출력 함수(2)[fread, fwrite]





© 2021.02. by kirim

Powered by kkrim