파일 입출력
C++ 파일 관련 클래스
<fstream>
ifstream : input file stream
ofstream : output file stream
fstream : file stream
cin, cout도 표준 입출력을 담당하는 객체
istream, ostream -> iostream
1. 출력스트림
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream output;
output.open("scores.txt");
output << "John" << " " << "T" << " " << "Smith" << " " << 90 <<endl;
output << "Eric" << " " << "K" << " " << "Jones" << " " << 85 <<endl;
output.close();
cout<<"Done"<<endl;
return 0;
}
output.open("파일 경로")를 통해 파일 생성하고 객체와 연결
output << ... 으로 파일에 출력
output.close() 로 파일을 닫는다
-> 객체하고 파일의 연결을 끊음
파일을 닫지 않는 경우 데이터 손실이 발생할 수 있다. 적절히 저장되지 못할 수도 있다.
- 파일 생성과 열기를 동시에 할 수 있다.
ofstream output("scores.txt");
# 스트림 조정자
setw() //setwidth
- 파일로 데이터 쓰기
파일이 존재하지 않으면 새로운 파일이 생기고, 파일이 이미 존재한다면 이전 내용은 경고없이 지워지고 덮어쓰게 된다.
2. 입력스트림
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
ifstream input;
input.open("scores.txt");
//ifstream input("scores.txt");
string firstName;
char mi;
string lastName;
int score;
input >> firstName >> mi >> lastName >> score; //데이터 읽기
cout << firstName << " " << mi << " "<< lastName <<" "<<score << endl;
input >> firstName >> mi >> lastName >> score; //데이터 읽기
cout << firstName << " " << mi << " "<< lastName <<" "<<score << endl;
input.close();
cout<<"Done"<<endl;
return 0;
}
데이터를 올바르게 읽기 위해서는 데이터가 어떻게 저장되어 있는지를 알아야 함
파일에 저장된 타입과 읽어들이는 변수 타입이 다르면 코드가 제대로 동작하지 않는다
3. 파일존재 여부 테스트
- 파일을 읽으려고 할 때 파일이 없으면 예측할 수 없는 오류가 발생할 수 있다.
- 파일이 존재하는지 확인
open()함수 호출 즉시 fail() 함수를 호출한다.
input.open("scores.txt");
if(input.fail()){
cout <<"File does not exist" <<endl;
return 0;
}
4. fstream 과 파일 열기 모드
: 프로그램이 한 스트림 객체로 입출력 모두를 할 수 있다.
- 파일 열기 모드
ios::in | 입력을 위한 파일 열기 |
ios::out | 출력을 위한 파일 열기 |
ios::app | 모든 출력을 파일의 끝에 추가 |
ios::ate |
ios::out + 파일이 존재하면 파일의 끝으로 이동. 데이터는 파일의 아무 곳이나 쓰기 가능 (파일 포인터) |
ios::trunc |
파일이 이미 존재하면, 파일의 내용을 버림 (ios::out 에 대한 기본 동작) |
ios::binary | 이진 입출력을 위한 파일 열기 |
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
fstream inout;
inout.open("city.txt",ios::out);//파일 생성,객체와 연결
inout << "Dallas Houston Atlanta ";//쓰기
inout.close();
inout.open("city.txt", ios::out|ios::app);//append모드로 파일 열기/연결
inout << "Savannah Austin Chicago";//파일에 내용 추가
inout.close();
string city;
inout.open("city.txt", ios::in);//읽기 모드로 파일 열기&연결
while(!inout.eof()){ //eof 만날 때까지 읽어들이기
inout >> city;
cout<<city<<" ";
}
inout.close();
return 0;
}
- eof()
:End of File
파일의 끝에는 eof마크가 있다.
파일 포인터가 가리키는 부분이 eof 마크가 아니라면 while 안으로 들어가서
inout >> city;
파일 내용을 하나씩 읽어 모니터에 출력하고 파일포인터는 하나 이동
(공백을 만나기 전까지 하나의 data라고 생각하고 읽음)
- getline()
>> (stream추출 연산자)를 사용하여 데이터 읽기 -> 공백이 있는 문자열을 읽어올 수 없다.
getline() 함수는 공백있는 문자열을 읽어들인다. <string>
구분문자나 eof표시를 만나면 문자읽기를 멈춘다.
getline(ifstream& input, string s, [char delimit character])
첫번째 매개변수는 어떤 파일에서 읽어올지를 나타내고 두번째 변수는 읽어들인 값을 담을 공간, 세번째 매개변수는 구분문자로 한번에 읽어들일 데이터를 구분하는 것
구분문자는 읽어들일 문자열을 구분하기 위한 문자로 저장하지는 않는다. (기본값 '\n')