C++ 파일읽기 파일쓰기

C++ 파일읽기 파일쓰기

올해 목표는 C++로 게임 제작이다. 아무리 엔진을 쓴다지만 너무 기초가 없는 것 같아서 파일입출력을 실습해보았다.

0. 본 코드의 내용은 data/input.txt 파일의 내용을 한 줄씩 읽어들여서, 그 내용을 data/output.txt 에 출력하는 것이다.

1. Windows.h 를 include 했는데 이건 Sleep 함수를 쓰기 위함이다. cmd 에 출력한 스트링을 볼 새도 없이 곧바로 닫히는 문제점이 있어서 Sleep을 걸었다.

2.  문자열 출력에 쓰이는 cout << 문자열 << endl; 명령어가 아무래도 눈에 익지 않아서 println이라는 래퍼함수를 만들었다. 여기서 “식별자를 찾을 수 없습니다.” 에러가 나서 잠깐 헤맸다. 검색해보니 C++는 함수도 변수처럼 상단에 선언되어야 하단에서 사용 가능하다. C만 그렇다고 생각했는데 C++도 그런줄 몰랐다.

3. 파일입출력을 위해 fstream 이라는걸(이걸 라이브러리라고 불러야 하나요? .h가 붙은 것과 붙지 않은 것의 차이는 뭔가요? 전자는 헤더라고 부르는데, 후자도 헤더라고 부르나요?) 인크루드했다. ifstream과 ofstream을 사용하고 닫아줘야 한다고 생각했는데… 닫지 않아도 된다고 한다. 찾아보니 소멸자가 있어서 소멸자에서 닫아준다고. 자바는 파일입출력시에 사용한 객체를 꼭 닫아줘야 하는데, 소멸자가 있다는게 편리할 수도 있다는걸 깨달았다.

4. 파일을 읽고 쓰는 위치는 .cpp 소스파일의 위치를 기준으로 한다.

#include <Windows.h>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

void println(string s) {
    cout << s << endl;
}

int main() {
    ifstream ins(“data/input.txt”);

    if (!ins.is_open()) {
         println(“파일을 찾을 수 없습니다!”);
         Sleep(1000);
         return 0;
    }

    // 파일이 없으면 생성. 파일이 있으면 덮어씀
    ofstream outs(“data/output.txt”);

    // 이어쓰기하려면 아래와 같이 작성
    // ofstream outs(“data/output.txt”, ios::app);
 
    char buf[1000];

    while (!ins.eof()) {
        // 1000자까지 읽어들이기
        ins.getline(buf, 1000);
        println(buf);

        if (outs.is_open()) {
            outs << buf << endl;
        }
    }

    Sleep(1000);
    return 0;
}