File Input
파일 입력
- C++ 코드상에서 키보드를 통한 입력이 아닌, 파일을 통한 데이터의 입력 방법을 의미한다.
* Console I/O(콘솔 I/O) : 키보드 입력 + 디스플레이 출력 환경을 의미한다.
C++에서 파일입력시의 기본 원칙
- \(\texttt{<fstream>}\) 헤더파일을 포함시켜야 한다.
(\(\texttt{<fstream>}\) 헤더파일에는 입력을 처리하는 \(\texttt{ifstream}\) 클래스가 정의되어 있다.)
- 하나 이상의 \(\texttt{ifstream}\) 변수 또는 객체를 선언해야 한다.
(일반적인 명명 규칙 범위 내에서 프로그래머가 원하는 이름으로 지정할 수 있다.)
- \(\texttt{std}\) namespace 를 지정해야 한다.
- 선언한 \(\texttt{ifstream}\) 객체와 입력을 받는 파일을 연결시켜야 한다.
(한 가지 방법으로, \(\texttt{open()}\) 메서드를 활용하는 방법이 있다.)
- 파일을 다루는 모든 작업이 끝나면 \(\texttt{close}\) 메서드를 이용하여 해당 파일을 닫아야 한다.
- \(\texttt{ifstream}\) 객체에 \(\texttt{>>}\) 연산자를 이용하여 다양한 타입의 데이터를 입력받을 수 있다.
(\(\texttt{ifstream}\) 객체는 키보드 입력시에 사용하는 \(\texttt{cin}\) 객체와 활용방법이 매우 비슷하다.
\(\texttt{getline()\) 메서드를 이용하여 한 번에 한 행의 문자들을 읽어들일 수 있다.
그 외에, \(\texttt{eof()}\)) 메서드나 \(\texttt{fail()}\) 메서드를 활용해서 입력 성공 여부를 감지할 수 있다.)
- \(\texttt{ifstream}\) 객체 자체가 검사 조건으로 사용될 때, 마지막 읽기 시도가 성공이면 \(\texttt{true}\) 값을, 실패했으면 \(\texttt{false}\) 값으로 변환된다.
\(\texttt{ifstream}\) 객체의 생애주기 (선언 - 파일연결 - 데이터 입력 - 파일연결 해제)
ifstream objectName;
// ifstream 객체 "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;
objectName >> val;
char line[80];
fileName.getline(line, 80);
// 파일 연결 해제
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 키를 입력할 필요가 있다.
파일 입출력시에 위험을 감지하는 메서드
- \(\texttt{fail()}\) 메서드 : EOF를 검사함과 동시에 데이터형 불일치도 감지할 수 있다. EOF나 데이터형 불일치를 감지하면 \(\texttt{true}\)를 리턴한다. (프로그램이 파일의 EOF를 지나치게 읽게되는 경우의 방지책이 있어야한다.)
- \(\texttt{eof()}\) 메서드 : EOF만을 검사하며 EOF를 감지하면 \(\texttt{true}\)를 리턴한다.
- \(\texttt{good()}\) 메서드 : 마지막 읽기시도가 양호할 경우 \(\texttt{true}\)를 리턴한다. (이 메서드를 통한 검사를 적용하기 전에 어떠한 입력을 읽는 시도가 적어도 한 번은 있어야 하므로 루프내에서 사용시에 주의해야 한다.)
- \(\texttt{bad()}\) 메서드 : Corrupted File(파일깨짐) 문제나 H/W Failure(하드웨어 불통) 문제를 감지할 경우 \(\texttt{true}\)를 리턴한다.