클래스명
클래스 이름은 ofstream이다. 아무래도 Out File Stream의 약자일 것 같다.
기능
ofstream 클래스는 파일 쓰기 기능을 한다.
헤더
ofstream 클래스는 fstream 헤더를 포함해야 사용할 수 있다. 그리고 fstream 헤더 내부의 std 네임스페이스 안에 있는 것 같다. using std::ofstream 선언을 해줘야 사용할 수 있기 때문이다.
사용 예제 1
#include <iostream> //endl 을 위한 헤더
#include <fstream> //ofstream 을 위한 헤더
using std::endl;
using std::ofstream;
int main(void) {
ofstream test("output.txt"); //파일 개방
for (int i = 0; i < 10; i++) { //파일에 1~9까지 저장
test << i << endl;
}
test.close(); //파일 닫기
return 0;
}
8번째 줄에 test()는 무엇일까? ofstream 이 클래스니까 그다음에 오는 키워드는 객체 이름일 것이다. 그런데 객체 이름 자리에 함수가 왔네? 그렇다면 이건 아무래도 생성자에 인자를 전달하는 형식일 것이다. 객체 이름은 내가 원하는 대로 정하는 것이므로 test 란 이름은 자유롭게 바꿀 수 있다.
11번째 줄에 << 연산자를 사용할 수 있다는 것이 참 신선하다.
14번째 줄에 개방했던 파일을 닫아줘야 한다는 것도 잊지 말자.
개방 모드
<사용 예제 1> 은 간단해서 쓰기에 아주 좋다. 그런데 한 가지 아쉬운 점이 있다. 위의 코드는 항상 기존의 파일은 지워지고 새 파일만 저장된다. 그런데 만약 기존의 파일에 이어서 내용을 작성하고 저장하고 싶다면 어떻게 해야 될까? 이때 필요한 것이 개방 모드이다.
ios::in | 읽기만 가능한 형태로 파일 오픈 |
ios::out | 쓰기만 가능한 형태로 파일 오픈 |
ios::ate | 파일을 오픈하면서 파일포인터를 끝부분으로 옮김 |
ios::app | 출력하는 데이터가 항상 파일의 끝에 기록 |
ios::trunc | 오픈하고자 하는 파일이 이미 있는경우, 기존의 파일을 삭제하고 다시 만듦 |
ios::nocreate | file open 을 시도하지 않고 file의 존재 여부만 판단. file이 존재하지 않을 경우 에 러를 발생 (파일을 생성하지 않음) |
ios::noreplace | nocreate 와 반대. file이 존재하면 에러를 발생 |
ios::binary | 바이너리 파일 모드로 오픈 |
위의 개방 모드를 이용해 <사용 예제 1>을 파일에 이어 쓸 수 있는 코드로 바꿔보자.
사용 예제 2
#include <iostream> //endl 을 위한 헤더
#include <fstream> //ofstream, ios 을 위한 헤더
using std::endl;
using std::ofstream;
using std::ios;
int main(void) {
ofstream test("output.txt", ios::out | ios::app); //파일 개방
for (int i = 0; i < 10; i++) { //파일에 1~9까지 저장
test << i << endl;
}
test.close(); //파일 닫기
return 0;
}
9번째 줄에 개방 모드를 이용해 파일을 개방했다. 파일을 출력하므로 ios::out 이 선언됐고, 이어 쓰기 할 것이므로 ios::app 도 선언됐다. 이렇게 '|' 연산자로 여러 개의 모드를 같이 선언할 수 있다. 참고로 ofstream의 default 개방 모드는 ios::out|ios::truc이다.
6번째 줄에는 using std::ios 선언을 해주고 있다. ios 키워드 역시 fstream 헤더의 std 네임스페이스 안에 있으므로 using std::ios 선언을 해주지 않으면 사용할 수 없다.
'컴퓨터' 카테고리의 다른 글
GetCursorPos() (0) | 2019.04.24 |
---|---|
strcmp(), compare() (0) | 2019.04.24 |
4-6. friend 선언 (0) | 2019.04.11 |
4-4 클래스와 배열 (0) | 2019.04.10 |
4-2. 캡슐화(Encapsulation) (0) | 2019.04.09 |