본문 바로가기

컴퓨터

ofstream

클래스명

클래스 이름은 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