[C]파일입출력 함수(1)[stream, fopen, fclose]
이 포스트는 고수준 파일입출력 함수에 관한 포스트입니다.
< 목차 >
1. 스트림(stream)
2. fopen함수
3. fclose함수
4. fread함수
5. fwrite함수
6. 스트림 표시자
7. stderr(에러출력 스트림)
< C에서 파일다루기 >
- C에는 C#처럼 파일내용을 한번에 읽어와서 문자열 배열로 반환하는 등의 함수가 없습니다.
- 파일을 복사하는 함수도 없습니다.
- 각 운영체제에서 제공하는 함수를 사용해야합니다.
- 혹은 기능을 직접 스트림 읽기/쓰기 함수를 사용해서 구현해야 합니다.
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을 닫아주어야 합니다.
}