File Output
파일 출력
- C++ 코드상에서 디스플레이를 통한 출력이 아닌, 파일을 통한 데이터의 출력 방법을 의미한다.
* Console I/O(콘솔 I/O) : 키보드 입력 + 디스플레이 출력 환경을 의미한다.
C++에서 파일출력시의 기본 원칙
- \(\texttt{<fstream>}\) 헤더파일을 포함시켜야 한다.
(\(\texttt{<fstream>}\) 헤더파일에는 출력을 처리하는 \(\texttt{ofstream}\) 클래스가 정의되어있다.)
- 하나 이상의 \(\texttt{ofstream}\) 변수 또는 객체를 선언해야 한다.
(일반적인 명명 규칙 범위 내에서 프로그래머가 원하는 이름으로 지정할 수 있다.)
- \(\texttt{std}\) namespace 를 지정해야 한다.
- 선언한 \(\texttt{ofstream}\) 객체와 출력시킬 파일을 연결시켜야 한다.
(한 가지 방법으로, \(\texttt{open()}\) 메서드를 활용하는 방법이 있다.)
- 파일을 다루는 모든 작업이 끝나면 \(\texttt{close()}\) 메서드를 이용하여 해당 파일을 닫아야 한다.
- \(\texttt{ofstream}\) 객체에 \(\texttt{<<}\) 연산자를 이용하여 다양한 타입의 데이터를 출력할 수 있다.
(\(\texttt{ofstream}\) 객체는 콘솔 출력시에 사용하는 \(\texttt{cout}\) 객체와 활용방법이 매우 비슷하다.
\(\texttt{<<}\)연산자, \(\texttt{endl}\), \(\texttt{setf()}\) 등등)
* 파일출력의 기본절차
1. \(\texttt{<fstream>}\) 헤더파일을 포함시킨다.
2. \(\texttt{ofstream}\) 객체를 생성한다.
3. \(\texttt{ofstream}\) 객체에 파일을 연결시킨다.
4. \(\texttt{ofstream}\) 객체를 \(\texttt{cout}\) 객체와 동일한 방식으로 사용한다. (예외사항도 물론 있음)
\(\texttt{ofstream}\) 객체의 생애주기
ofstream objectName;
// ofstrem 객체 "objectName"을 선언한다.
objectName.open("fileName.txt");
// "objectName" 객체에 fileName.txt 파일을 연결시킨다.
// 파일을 연결하는 다른방법 (사용자로부터 입력받는 방법)
char File[50];
cin >> File;
objectName.open(File);
// 파일 연결 성공여부를 확인하는 방법
if (!objectName.is_open())
exit(EXIT_FAILURE); // <cstdlib> 헤더파일에 정의되어 있는 STL
// 연결된 파일에 데이터를 출력하는 방법
double val = 12.34;
objectName << val;
// 파일 연결 해제
objectName.close();
- \(\texttt{open()}\) 메서드는 매개변수로 C Style 문자열을 요구한다.
(리터럴 문자열이나 배열에 저장된 문자열을 매개변수로 사용할 수 있다.)
- 특정 파일을 연결한(생성한) 상태에서 또 다시 해당 파일에 연결할 경우,(똑같은 프로그램을 다시 실행하는 경우도 이에 해당한다.) \(\texttt{open()}\) 메서드는 파일에 있던 기존내용을 폐기하고 입력된 데이터의 길이를 0으로 만들고 나 다음에 새로운 내용을 출력한다. (이를 방지하는 방법도 존재한다.)
- \(is_open()\) 메서드는 파일이 성공적으로 열렸으면 \(\texttt{true}\) 값을 리턴한다.
(\(is_open()\) 메서드의 전신으로 \(\texttt{good()}\) 메서드가 있으며, \(is_open()\) 메서드 만큼 발생 가능한 문제들에 대해 폭넓게 검사하지는 못한다.)
- \(\texttt{exit()}\) 메서드는 \(\texttt{<cstdlib>}\) 헤더파일에 정의되어 있으며, OS와 소통하는데 사용하는 매개변수 값으로 \(\texttt{EXIT_FAILURE}\) 가 정의되어있다. 해당 구문은 프로그램을 종료시키는 역할을 한다.
- \(\texttt{close()}\) 메서드는 어떠한 매개변수도 요구하지 않으며, 파일 연결 해제를 안하더라도 프로그램이 정상적으로 종료된다면 파일은 자동으로 닫힌다.
(이미 파일에 연결되어 있기 때문에, 매개변수로써 파일이름을 다시 명시할 필요는 없다.)
* Windows 테스트 파일에서는 행이 종료되고 다음 라인으로 이동될 때, 같은 행의 맨 앞으로 이동한 후에 다음 라인으로 이동하는 조합을 사용한다. (CR + LF 조합 ; Carriage Return + Line Feeding 조합) 일반적인 C++ 텍스트 모드는 파일을 읽을 때는 CR + LF 조합을, 파일을 쓸 때는 반대 조합을 이용한다. Metrowerks CodeWarrior IDE 에디터와 같은 일부 에디터들은 이와 같은 조합을 자동적으로 추가하지 않기 때문에 어떤 에디터를 사용하느냐에 따라 마지막 텍스트를 입력한 후 파일을 빠져나오기 전에 Enter 키를 입력할 필요가 있다.