파일 입출력
파일(file)이란?
파일(file)이란 의미 있는 정보를 담고 있으며, 이름을 가지고 있는 저장 장치상의 논리적인 단위를 의미합니다.
C++은 이러한 파일을 바이트별로 따로 읽을 수 있는 연속적인 바이트의 집합으로 취급합니다.
파일의 종류
컴퓨터는 파일을 다음과 같이 두 가지 종류로 나누어서 다룹니다.
1. 바이너리 파일(binary file)
2. 텍스트 파일(text file)
바이너리 파일은 데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일을 가리킵니다.
프로그램이 이 파일의 데이터를 읽거나 쓸 때는 데이터의 어떠한 변환도 일어나지 않습니다.
텍스트 파일은 사람이 알아볼 수 있는 문자열로 이루어진 파일을 가리킵니다.
프로그램이 이 파일의 데이터를 읽거나 쓸 때는 포맷 형식에 따라 데이터의 변환이 일어납니다.
C++ 파일 입출력 클래스
C++에서는 파일의 입출력을 표준 입출력처럼 처리합니다.
C++ 표준 입출력은 iostream 헤더 파일의 istream 클래스와 ostream 클래스의 멤버 함수로 처리합니다.
이와 마찬가지로 C++ 파일 입출력은 fstream 헤더 파일의 클래스 라이브러리를 가지고 처리하게 됩니다.
파일의 입력은 ifstream 클래스로, 파일의 출력은 ofstream 클래스의 멤버 함수로 처리합니다.
이 클래스는 iostream 헤더 파일의 클래스로부터 파생된 클래스입니다.
파일의 입출력
C++에서 파일에 대한 입출력 동작은 다음과 같은 순서에 따라 진행됩니다.
1. 스트림을 관리하기 위한 ifstream(또는 ofstream) 객체를 생성
2. 특정 파일과의 연결
3. cin 객체나 cout 객체와 같은 방법으로 객체를 사용하여 입출력 수행
4. 모든 작업이 끝나면 파일과의 연결 종료
특정 파일과의 연결은 open() 멤버 함수를 사용하여 다음과 같이 수행합니다.
예제
ifstream ifs; // ifs라는 ifstream 객체를 생성함.
ifs.open("example.txt"); // ifs를 example.txt와 연결함.
위에서 살펴본 ifstream 객체의 생성과 파일과의 연결을 다음과 같이 한 줄로 결합할 수도 있습니다.
예제
ifstream ifs("example.txt"); // ifs라는 ifstream 객체를 생성하고, example.txt와 연결함.
이렇게 연결된 파일에서 cin 객체를 사용하는 방법과 동일한 방법으로 파일의 내용을 읽을 수 있습니다.
예제
char ch;
char buf[20];
string str;
ifs >> ch; // example.txt 파일에서 한 문자를 읽어 변수 ch에 저장함.
ifs.getline(buf, 20); // example.txt 파일에서 한 행을 읽어 배열 buf에 저장함.
getline(ifs, str); // example.txt 파일에서 한 행을 읽어 문자열 객체인 str에 저장함.
앞서 생성한 입출력 파일 스트림 객체의 수명이 다 하면 파일은 자동으로 닫힙니다.
또한, close() 멤버 함수를 통해 명시적으로 파일과의 연결을 닫을 수도 있습니다.
예제
ifs.close(); // 파일과의 연결을 닫음.
스트림의 상태 검사
C++의 파일 입출력 클래스는 스트림의 상태를 검사해주는 ios_base 클래스의 멤버 함수를 상속받습니다.
과거의 C++에서는 파일을 성공적으로 열었는지를 다음과 같은 방법으로 확인했습니다.
예제
1. if (ifs.fail()) { ... } // 파일을 여는데 실패한 경우
2. if (!ifs.good()) { ... } // 파일을 여는데 실패한 경우
3. if (!ifs) { ... } // 파일을 여는데 실패한 경우
최신의 C++에서는 파일의 성공적인 개방을 is_open 멤버 함수를 통해 확인할 수도 있습니다.
예제
if (!ifs.is_open()) { ... } // 파일을 여는데 실패한 경우
다음 예제는 C++에서 단순히 파일을 열어 그 안에 저장된 텍스트 한 줄을 읽어 오는 예제입니다.
예제
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream ifs;
string str;
ifs.open("example.txt"); // "C++ 프로그래밍"
if(!ifs.is_open())
{
cout << "파일을 열 수가 없습니다!" << endl;
exit(1);
}
else
{
cout << "파일을 성공적으로 열었습니다!" << endl;
getline(ifs, str);
cout << str << endl;
ifs.close();
}
}
실행 결과
파일을 성공적으로 열었습니다!
C++ 프로그래밍