C++ 파일 입출력
파일 : 연속된 바이트의 집합.
텍스트 파일
바이너리 파일
istream, ostream의 부모 클래스인 ifstream, ofstream 사용 iostream의 부모 클래스인 fstream 사용
파일 입출력 모드 : 텍스트 I/O와 바이너리 I/O
① open(경로/파일이름, 용도지정)
② 읽기/쓰기
③ close()
ofstream fout;
fout.open("c:\\temp\\test.txt");
fout << "Hello World" << endl;
fout.close();
ifstream fin;
fin.open("c:\\temp\\test.txt");
fin >> text;
cout << text << endl;
fin.close();
파일 모드(file mode)
| 파일 모드 | 의미 |
|---|---|
| ios::in | 읽기 위해 파일을 연다. |
| ios::out | 쓰기 위해 파일을 연다. |
| ios::ate | (at end) 쓰기 위해 파일을 연다. 열기 후 파일 포인터를 파일 끝에 둔다. 파일 포인터를 옮겨 파일 내의 임의의 위치에 쓸 수 있다. |
| ios::app | 파일 쓰기 시에만 적용된다. 파일 쓰기 시마다, 자동으로 파일 포인터가 파일 끝으로 옮겨져서 항상 파일의 끝에 쓰기가 이루어진다. |
| ios::trunc | 파일을 열 때, 파일이 존재하면 파일의 내용을 모두 지워 파일 크기가 0인 상태로 만든다. ios::out 모드를 지정하면 디폴트로 함께 지정된다. |
| ios::binary | 바이너리 I/O로 파일을 연다. 이 파일 모드가 지정되지 않으면 디폴트가 텍스트 I/O이다. |
fout.open("student.txt", ios::out | ios::app); // out과 app 모드 동시 지정
while((c = fin.get()) != EOF) { // EOF를 만날 때까지 문자 읽기
cout << (char)c;
}
텍스트 파일의 라인 단위 읽기
while(fin.getline(buf, 81)) { // 한 라인이 최대 80개의 문자로 구성
cout << buf << endl; // 라인 출력
}
바이너리 I/O
ios::binary 모드 속성 사용
◼ ios::binary가 설정되지 않으면 디폴트가 텍스트 I/O
스트림 상태
| 비트 | 설명 |
|---|---|
| eofbit | 파일의 끝을 만났을 때 1로 세팅 |
| failbit | 정수를 입력받고자 하였으나 문자열이 입력되는 등 포맷 오류나, 쓰기 금지된 곳에 쓰기를 시행하는 등 전반적인 I/O 실패 시에 1로 세팅 |
| badbit | 스트림이나 데이터가 손상되는 수준의 진단되지 않는 문제가 발생한 경우나 유효하지 않는 입출력 명령이 주어졌을 때 1로 세팅 |
| 멤버 함수 | 설명 |
|---|---|
| eof() | 파일의 끝을 만났을 때(eofbit=1) true 리턴 |
| fail() | failbit나 badbit가 1로 세팅되었을 때 true 리턴 |
| bad() | badbit이 1로 세팅되었을 때 true 리턴 |
| good() | 스트림이 정상적(모든 비트가 0)일 때 true 리턴 |
| clear() | 스트림 상태 변수를 0으로 지움 |
// 정수 값으로 주어진 절대 경로 pos로 get pointer를 옮김
istream& seekg(streampos pos)
// seekbase를 기준으로 offset만큼 떨어진 위치로 get pointer를 옮김
istream& seekg(streamoff offset, ios::seekdir seekbase)
// 정수 값으로 주어진 절대 경로 pos로 put pointer를 옮김
ostream& seekp(streampos pos)
// seekbase를 기준으로 offset만큼 떨어진 위치로 put pointer를 옮김
ostream& seekp(streamoff offset, ios::seekdir seekbase)
//입력 스트림의 현재 get pointer의 값 리턴
streampos tellg()
// 출력 스트림의 현재 put pointer의 값 리턴
streampos tellp()
| seekbase | 설명 |
|---|---|
| ios::beg | 파일의 처음 위치를 기준으로 파일 포인터를 움직인다. |
| ios::cur | 현재 파일 포인터의 위치를 기준으로 파일 포인터를 움직인다. |
| ios::end | 파일의 끝(EOF) 위치를 기준으로 파일 포인터를 움직인다. |