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. 파일 경로
  2. 모드


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()

무조건 닫아주자

Reference

Leave a comment