파일 입출력 (I/O)시 쓰이는 Lib
- ifstream : 파일입력
- ofstream : 파일 출력
- fstream: 파일 입력 및 출력
파일 스트림에 <<, >>, 조정자 등을 쓸 수 있다.
C언어와의 비교
- C
FILE *fp;
fp = fopen("hello.txt", "r");
fp = fopen("hello.txt", "w+");
fp = fopen("hello.txt", "rt");
- C++
ifstream fin;
fin.open("hello.txt");
ofstream fout;
fout.open("hello.txt");
fstream fs;
fs.open("hello.txt");
각 Stream 마다 open() 함수가 있다. Open(“filename”, ios-base::in | ios-base::binary) <- binary로도 읽을 수 있다.
-
option 비교
C C++ “r” in “w” out
out |trunc“a” out | app “rt” in|out “wt” in|out|trunc
파일 닫기
- C
FILE *fp;
// ...
fclose(fp);
- C++
fstream fs;
// ...
fs.close(); // fstream 소멸자에서 닫아주기는 한다.
스트림 상태 확인
- C
FILE *fp;
fp = fopen("open.txt", "rt");
if (fp != NULL)
{
// ...
}
- C++
fstream fs;
fs.open("open.txt");
if (fs.is_open())
{
//...
}
파일에서 문자 하나씩 읽기
- C
FILE *fp;
fp = fopen("open.txt", "r");
char c;
do
{
c = getc(fp);
printf("%c", c);
}while(c != EOF)
fclose(fp);
- C++
ifstream fin;
fin.open("open.txt");
char c;
while(true)
{
fin.get(c);
if (fin.fail())
{
break;
}
cout << c;
}
fin.close();
get, getline 함수는 cin, istringstream, ifstream 모두 동일하게 적용 -> 추상화가 잘 되어 있음
위 소스에서 get을 getline으로 바꾸면 한줄씩 읽기가 된다.
여기서 잘못된 입력을 고려해야되는데,
- 숫자들과 뉴라인
- 잘못된 입력과 숫자들
만약, 잘못 입력된 값을 string으로 저장할 경우, 먼저 clear()를 해줘야 한다.
-> 그래야 failbit가 false로 초기화 되서 읽을 수 있다. failbit가 true면 읽지 않음.
while(!fin.eof())
{
cin >> number;
if (cin.fail())
{
clear();
cin.ignore(1);
cin >> trash
}
else
cout << number << endl;
}
파일에 쓰기
- C
FILE *fp;
fp = open("output.txt", "w");
char line[512];
if (fgets(line, 512, stdin) != NULL)
{
fprintf(fp, "%s\n", line);
}
fclose(fp);
- C++
ofstream fout;
fout.open("output.txt");
string line;
getline(cin.line);
if(!cin.fail())
{
fout << line << endl;
}
fin.close();
바이너리 파일 읽기
- C
FILE *fp;
fp = fopen("binary.dat", "rb");
if (fp != NULL)
{
Record record;
fread(&record, sizeof(Record), !fp);
}
fclose(fp);
- C++
ifstream fin("binary.dat", ios-base::in | ios-base::binary);
if (fin.is_open())
{
Record record;
fin.read((char *)&record, sizeof(Record));
}
fin.close();
ifstream:read() : read(char*, streamsize); ex) fin.read(&firstName, 20); -> 파일로 부터 20바이트 읽어서 firstName에 저장
바이너리 파일에 쓰기
- C
FILE *fp;
fp = fopen("binaryOutput.dat", "w");
if (fp != NULL)
{
char buffer[20] = "Ha-Young Choi";
fwrite(buffer, 20, 1, fp);
}
fclose(fp);
- C++
ofstream fout("binaryOutput.dat", iosbase:out | iosbase:binary);
if(fout.is_open())
{
char buffer[20] = "Ha-Young Choi";
fout.write(buffer, 20);
}
fout.close();
파일에서 탐색
- C
FILE *fp;
fp = fopen("open.txt", "w");
if (fp != NULL)
{
if (fSeek(fp, 20, SEEK_SET) == 0)
{
// ...
}
}
fclose(fp);
- C++
fstream fs("open.dat", iobase:in|out|binary);
if (fs.is_open())
{
fs.seek(20, iosbase:beg);
if (!fs.fail())
{
// ...
}
}
fs.close();
탐색유형
-
절대적 -> fout.seek(20);
- 보통 tellp() // tellg()를 사용해서 기억해놨던 위치로 돌아갈 때 사용.
-
상대적 -> fout.seek(20, iosbase::cur);
- iosbase:beg - 처음 위치로 부터
- iosbase:cur - 현재 위치로 부터
- iosbase:end - 끝 위치로 부터
seekp와 마찬가지로 seekg도 있다. 쓰기 < - > 읽기
정리
- std::string 클래스
- 메모리, 메모리 그리고 메모리
- 문자열 스트림
- 파일 스트림