파일 입출력
파일에 대한 두가지 입출력 수준(즉, 파일에 대한 접근을 처리하는 두가지 수준)중 어느 하나를 선택할 수 있다. 저수준 입출력(Low-level I/O)은 운영체제가 제공하는 기본적인 입출력 서비스를 사용한다. 표준 고수준 입출력(standard high - level I/O)은 C라이브러리 함수들의 표준 패키지와 stdio.h 헤더 파일정의들을 사용한다.
모든 운영체제가 동일한 저수준 입출력 모델로 표현될 수 있다는 보장이 없기 때문에, C 표준은 입출력 패키지만을 제공한다.
C프로그램은 사용자를 위해 표준 입력(standard input), 표준 출력(standard output), 표준 에러 출력(standard error output) 이라는 세개의 파일을 자동으로 연다. 표준 입력은 디폴트로, 일반적으로 시스템이 사용하는 키보드와 같은 입력 장치다. 표준 출력과 표준에러 출력은 둘다 디폴트로, 일반적으로 시스템이 사용하는 디스플레이 스크린과 같은 출력 장치이다.
표준 입력은 당연히 프로그램에 입력을 제공한다. 그것은 getchar(), gets(), scanf()가 데이터를 읽는 파일이다. 표준 출력은 프로그램의 정상적인 출력이 나타나는 곳이다. putchar(), puts(), printf()가 그 파일을 사용한다. 리다이렉션은 다른 파일들을 표준입력이나 표준 출력으로 인식되게 만든다.
표준 에러출력 파일의 목적은 에러 메시지들을 출력할, 논리적으로 구분되는 어떤 장소를 제공하는 것이다. 예를 들어, 출력을 스크린 대신에 파일로 보내는 리디렉션을 사용할 때, 표준 에러 출력으로 보내지는 에러 메시지들은 여전히 스크린에 표시된다. 에러 메시지들 마저도 파일로 보내진다면, 그 파일을 열어보기 전까지는 에러 메시지들의 존재를 알 수 없기 때문이다.
표준 입출력 패키지가 저수준 입출력에 비해 가지는 장점.
1. 다양한 입출력 문제들을 간단하게 처리하는 전문화된 많은 함수들을 제공한다. 예를 들어, printf()는 다양한 유형의 데이터를 터미널에 적합한 문자열 출력으로 변환한다.
2.입력과 출력에 버퍼(buffer)를 사용한다. 즉, 정보가 한번에 한바이트씩 전달되지 않고, 큰 덩어리(일반적으로 한번에 512바이트 또는 그이상)로 전달된다.
버퍼를 사용
프로그램이 파일을 읽을 때, 한 덩어리의 데이터가 버퍼(중간 저장영역)로 복사된다. 이와 같은 버퍼링은 데이터 전송속도를 크게 증가시킨다. 그러고 나면 프로그램은 버퍼에 들어있는 개별적인 바이트들을 조사할 수 있다. 버퍼링은 무대 뒤에서 은밀하게 이루어진다. 그래서 사용자에게는 문자 단위로 입출력이 이루어지는 것처럼 보인다.
exit()함수는 열려있는 모든 파일들을 닫으면서 프로그램을 종료시킨다. 일반적으로 프로그램이 정상적으로 종료되는 경우에는 0을 전달하고, 비정상적으로 종료되는 경우에는 0이아닌 값들을 전달한다. 실패의 여러 원인들을 서로 구별하기 위해 서로다른 종료값들을 사용할 수 있다.
ANSI C표준은 정상적인 종료를 나타내기 위해 값 0 또는 매크로 EXIT_SUCCESS 를 사용할 것과, 비정상적인 종료를 나타내기 위해 EXIT_FAILURE를 사용할 것을 요구한다. 이들 매크로는, exit() 프로토타입과 함께, stdlib.h 헤더파일에 있다.
fopen()은 파일을 여는 함수이다. 이 함수는 stdio.h에 선언되어 있다. 첫번째 전달인자는 열려고 하는 파일의 이름이다. 좀더 정확하게 말하자면 파일이름을 가지고있는 문자열의 주소이다. 두번째 전달인자는 파일을 여는데 사용할 모드를 지정하는 문자열이다. C라이브러리는 여러가지 모드 문자열을 제공한다.
fopen()의 모드 문자열
모드문자열 의미
"r" 읽기위해 파일을 텍스트 모드로 연다.
"w" 쓰기 위해 파일을 텍스트 모드로 연다. 파일이 이미 존재하면 파일 길이를 0으로 만든다. 파일이 없으면 새 파일을 만든다.
"a" 쓰기위해 파일을 텍스트 모드로 연다. 파일이 이미 존재하면 그 파일 끝에 덧붙인다. 파일이 없으면 새파일을 만든다.
"r+" 갱신하기 위해(즉, 읽고 쓰기 위해)파일을 텍스트 모드로 연다.
"w+" 갱신하기 위해(즉, 읽고 쓰기위해)파일을 텍스트 모드로 연다. 파일이 이미 존재하면 파일길이를 0으로 만든다. 파일이 없으면 새 파일을 만든다.
"a+" 갱신하기 위해(즉, 읽고 쓰기 위해)파일을 텍스트 모드로 연다. 파일이 이미 존재하면 그 파일의 끝에 덧붙인다. 파일이 없으면 새파일을 만든다. 읽기는 전체를 읽을 수 있지만 쓰기는 끝에 덧 붙일수만 있다.
"rb","wb","ab","ab+" 텍스트 모드가 아닌 바이너리 모드로 동작한다는 것을 제외하고, 앞의 모드들과 같다.
"a+b","wb+","w+b"
"rb+","r+b"
"wx","wbx","w+x", 파일이 이미 존재하면 오픈하는것을 실패한다는 것을 제외하고 non-x와 같다.
"wb+x","w+bx"
'Programming > C' 카테고리의 다른 글
C언어 공부 28 (0) | 2019.06.12 |
---|---|
C언어 공부 27 (0) | 2019.06.12 |
C언어 공부 25 (0) | 2019.06.11 |
프로그래밍 연습 10 (0) | 2019.06.08 |
프로그래밍 연습 9 (0) | 2019.06.02 |