본문 바로가기
프로그래밍/C++

[C++] 9. C++의 "파일 입출력"

by iwbap 2024. 6. 17.
728x90

C++ 학습: 파일 입출력

파일 입출력은 프로그램이 파일과 상호작용하여 데이터를 읽고 쓰는 중요한 기능입니다. 이번 글에서는 파일 스트림, 파일 읽기와 쓰기, 그리고 파일 위치 조정에 대해 알아보겠습니다.


1. 파일 스트림: ifstream, ofstream, fstream

C++에서는 파일 입출력을 위해 표준 라이브러리 <fstream>을 사용합니다. 파일 스트림은 세 가지 주요 클래스가 있습니다:

  • ifstream : 입력 파일 스트림으로, 파일에서 데이터를 읽습니다.
  • ofstream : 출력 파일 스트림으로, 파일에 데이터를 씁니다.
  • fstream : 입출력 파일 스트림으로, 파일에 데이터를 읽고 쓸 수 있습니다.

파일 스트림 사용 예제

[cpp]
 
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // ofstream을 사용하여 파일에 쓰기
    ofstream outFile("example.txt");
    if (outFile.is_open()) {
        outFile << "Hello, World!" << endl;
        outFile << 123 << endl;
        outFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    // ifstream을 사용하여 파일에서 읽기
    ifstream inFile("example.txt");
    string line;
    if (inFile.is_open()) {
        while (getline(inFile, line)) {
            cout << line << endl;
        }
        inFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    return 0;
}
 

위의 예제에서 ofstream을 사용하여 "example.txt" 파일에 데이터를 쓰고, ifstream을 사용하여 같은 파일에서 데이터를 읽습니다.


2. 파일 읽기와 쓰기: 텍스트 파일과 바이너리 파일 처리

C++에서는 텍스트 파일과 바이너리 파일을 읽고 쓸 수 있습니다. 텍스트 파일은 사람이 읽을 수 있는 형식으로 데이터를 저장하고, 바이너리 파일은 이진 형식으로 데이터를 저장합니다.

 

- 텍스트 파일 쓰기

[cpp]
 
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ofstream outFile("textfile.txt");
    if (outFile.is_open()) {
        outFile << "This is a text file." << endl;
        outFile << "It contains lines of text." << endl;
        outFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    return 0;
}
 
 

- 텍스트 파일 읽기

[cpp]
 
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream inFile("textfile.txt");
    string line;
    if (inFile.is_open()) {
        while (getline(inFile, line)) {
            cout << line << endl;
        }
        inFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    return 0;
}
 
 

- 바이너리 파일 쓰기

[cpp]
 
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ofstream outFile("binaryfile.bin", ios::binary);
    if (outFile.is_open()) {
        int num = 123;
        outFile.write(reinterpret_cast<char*>(&num), sizeof(num));
        outFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    return 0;
}
 
 

- 바이너리 파일 읽기

[cpp]
 
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream inFile("binaryfile.bin", ios::binary);
    if (inFile.is_open()) {
        int num;
        inFile.read(reinterpret_cast<char*>(&num), sizeof(num));
        cout << "Read number: " << num << endl;
        inFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    return 0;
}
 

위의 예제에서는 텍스트 파일과 바이너리 파일을 읽고 쓰는 방법을 보여줍니다. 텍스트 파일은 문자열을 읽고 쓰며, 바이너리 파일은 이진 데이터를 읽고 씁니다.


3. 파일 위치 조정: 파일 위치 지시자 조작

파일 위치 지시자는 파일 내에서 읽기 또는 쓰기 작업이 수행될 위치를 가리킵니다. 파일 위치 지시자를 조작하여 파일의 특정 위치로 이동할 수 있습니다.

 

- 파일 위치 조정 예제

[cpp]
 
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // 파일에 데이터 쓰기
    ofstream outFile("positionfile.txt");
    if (outFile.is_open()) {
        outFile << "Hello, World!" << endl;
        outFile << "This is a test file." << endl;
        outFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    // 파일에서 특정 위치로 이동하여 데이터 읽기
    ifstream inFile("positionfile.txt");
    if (inFile.is_open()) {
        inFile.seekg(7, ios::beg); // 파일 시작 위치로부터 7바이트 이동
        char ch;
        inFile.get(ch);
        cout << "Character at position 7: " << ch << endl;
        inFile.close();
    } else {
        cout << "파일 열기에 실패했습니다." << endl;
    }

    return 0;
}
 

위의 예제에서 seekg 함수를 사용하여 파일 위치 지시자를 조작합니다. seekg 함수는 파일 위치 지시자를 설정하여 파일의 특정 위치로 이동시킵니다.

  • ios::beg : 파일의 시작 위치
  • ios::cur : 파일의 현재 위치
  • ios::end : 파일의 끝 위치

파일 위치 지시자를 조작함으로써 파일 내에서 임의의 위치로 이동하여 데이터를 읽거나 쓸 수 있습니다.


이번 글에서는 C++의 파일 입출력에 대해 알아보았습니다. 파일 스트림, 파일 읽기와 쓰기, 파일 위치 조정을 이해하고 활용하면 파일과 상호작용하는 프로그램을 작성할 수 있습니다. 다음 단계에서는 예외 처리와 고급 기능을 학습해보세요. Happy Coding!

728x90