파일입출력: fstream
C++의 파일 입출력에 대해 알아보자
서론
어떤 알고리즘을 개발할 경우 실험 결과를 텍스트로 저장하는 경우가 많다
보통 텍스트 or 바이너리 파일로 저장을 하여 나중에 분석하는 경우가 많으므로 오늘은 C++ 스타일의 file stream에 대해 간략히 정리해보고자 한다
추가로 바로 예제 및 응용에 들어가보자
File Stream 정리
1. 헤더파일 선언
구구절절하게 나열하는 것보다 핵심적인 것만 적겠다
ifstream,ofstream을 나누지 말고 그냥 fstream을 불러와서 사용하자
#include <fstream>
솔직히 우리가 하고 싶은 기능은 아래와 같다
- open()
- close()
- read()
- write()
따라서 빠르게 사용하는 방법을 알아본다
2. 열기(open), 닫기(close)
중요 : 파일은 열었으면 무조건 닫아줘야 한다
이 부분은 진짜 명심하자!!
// file 객체 선언
fstream file;
// 열기
file.open("../output.txt", ios::in);
// 닫기
file.close();
여기서 열기 함수를 자세히 보자
file.open() 함수는 다음과 같이 구성되어 있다
- 파일 경로
- 모드
1번, 경로는 파일을 read(write)할 경로를 입력해준다
만약 읽을 텍스트파일이 /home/bigbigpark/Desktop/output.txt
라고 하자
그렇다면 아래 처럼 선언해준다
file.open("/home/bigbigpark/Desktop/output.txt", ios::in);
오케이, 그러면 첫 번째 인자는 파일 경로인데 두 번째 저 희한하게 생긴건 뭔데?
바로 file 객체의 모드를 나타내는 것이다
3. 모드 설정
모드는 굉장히 여러가지가 있다
하지만 실용적이게 자주 사용하는 모드만 골랐다
ios::in // 읽기 모드
ios::out // 쓰기 모드
ios::app // 파일 끝에 추가(=append)
ios::binary // 바이너리 모드
아래의 코드를 실행하면 쓰기 모드의 파일명 output.txt라는 텍스트 파일을 생성하겠다는 말이다
file.open("output.txt", ios::out);
오케이 그렇다면 파일에 텍스트를 써보자!
4. 데이터 쓰기
잠깐 정리하기 위해 전체적인 코드를 보자
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
// 파일 객체 선언
fstream file;
// 쓰기 모드로 설정
file.open("output.txt", ios::out);
// 데이터 쓰기
file << 1 << 2 << 3 << 4;
// 파일 닫기
file.close();
return 0;
}
stream 객체 이므로 operating 연산자인 =을 이용하여 값을 대입하는 방식이 아니라 그냥 밀어 넣는다고 보면 된다
따라서 아래와 같이 데이터를 넣을 수 있다
file << 1 << 2 << 3 << 4;
g++이나 cmake로 빌드 후에 실행해보면 아래의 사진처럼 결과가 나온다
이제 반대로 데이터를 읽어보자
5. 데이터 읽기
앞서 배웠듯이 파일 객체를 선언할 때 읽을 파일명과 읽기 모드만 설정해주면 된다
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
// 파일 객체 선언
fstream file;
// 읽기 모드로 설정
file.open("output.txt", ios::in);
int num;
while(!file.eof())
{
file >> num;
cout << num << endl;
}
// 파일 닫기
file.close();
return 0;
}
아까 쓰기에는 file << 1
이런 식이었다면 이번에는 반대로 file >> num
으로 받아주자
여기서 eof란 end of file이란 뜻이다
파일의 마지막 줄에 도달했을 때 true를 리턴한다
6. 닫기
file.close()
무조건 닫아주자
Leave a comment