산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 파일 입출력 마스터하기: fstream으로 읽고 쓰기

지금까지 iostream 표준 라이브러리를 사용해 cin과 cout 메서드로 표준 입력에서 읽고 표준 출력에 쓰는 방법을 다뤘습니다.

이 튜토리얼에서는 파일에서 읽고 쓰는 방법을 배웁니다. 이를 위해 fstream이라는 또 다른 표준 C++ 라이브러리가 필요하며, 이는 세 가지 새로운 데이터 타입을 정의합니다.

번호데이터 타입 및 설명
1

ofstream

출력 파일 스트림을 나타내며, 파일 생성과 파일에 정보 쓰기에 사용됩니다.

2

ifstream

입력 파일 스트림을 나타내며, 파일에서 정보 읽기에 사용됩니다.

3

fstream

일반적인 파일 스트림을 나타내며, ofstream과 ifstream의 기능을 모두 가져 파일 생성, 쓰기, 읽기가 모두 가능합니다.

C++에서 파일 처리를 수행하려면 헤더 파일 <iostream>과 <fstream>을 C++ 소스 파일에 포함해야 합니다.

파일 열기

파일에서 읽거나 파일에 쓰기 전에 파일을 열어야 합니다. ofstream 또는 fstream 객체로 파일을 쓰기 모드로 열 수 있고, ifstream 객체로 읽기 전용으로 열 수 있습니다.

open() 함수의 표준 구문은 다음과 같습니다. 이는 fstream, ifstream, ofstream 객체의 멤버입니다.

void open(const char *filename, ios::openmode mode);

첫 번째 인자는 열 파일의 이름과 위치를 지정하고, 두 번째 인자인 open() 멤버 함수의 모드 인자는 파일을 어떤 모드로 열지 정의합니다.

번호모드 플래그 및 설명
1

ios::app

추가 모드. 해당 파일에 대한 모든 출력이 파일 끝에 추가됩니다.

2

ios::ate

출력용으로 파일 열기 및 읽기/쓰기 제어를 파일 끝으로 이동.

3

ios::in

읽기용으로 파일 열기.

4

ios::out

쓰기용으로 파일 열기.

5

ios::trunc

파일이 이미 존재하면 열기 전에 내용이 잘립니다.

이 값들을 OR 연산으로 조합할 수 있습니다. 예를 들어 쓰기 모드로 파일을 열되 이미 존재하면 잘라내려면:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);

마찬가지로 읽기와 쓰기용으로 파일을 열려면:

fstream afile;
afile.open("file.dat", ios::out | ios::in);

파일 닫기

C++ 프로그램이 종료되면 자동으로 모든 스트림을 플러시하고, 할당된 메모리를 해제하며, 열린 모든 파일을 닫습니다. 하지만 프로그래머가 프로그램 종료 전에 열린 모든 파일을 닫는 것이 좋은 관행입니다.

close() 함수의 표준 구문은 다음과 같습니다. 이는 fstream, ifstream, ofstream 객체의 멤버입니다.

void close();

파일에 쓰기

C++ 프로그래밍에서 스트림 삽입 연산자(<<)를 사용해 프로그램으로부터 파일에 정보를 씁니다. 화면에 정보를 출력할 때 사용하는 연산자와 동일합니다. 유일한 차이는 cout 객체 대신 ofstream 또는 fstream 객체를 사용한다는 점입니다.

파일에서 읽기

스트림 추출 연산자(>>)를 사용해 파일로부터 프로그램으로 정보를 읽습니다. 키보드로부터 입력을 받을 때 사용하는 연산자와 동일합니다. 유일한 차이는 cin 객체 대신 ifstream 또는 fstream 객체를 사용한다는 점입니다.

읽기/쓰기 예제

다음 C++ 프로그램은 파일을 읽기/쓰기 모드로 엽니다. 사용자가 입력한 정보를 afile.dat 파일에 쓴 후, 파일에서 정보를 읽어 화면에 출력합니다.

Live Demo
#include <fstream>
#include <iostream>
using namespace std;
int main() {
    char data[100];
    // 쓰기 모드로 파일 열기
    ofstream outfile;
    outfile.open("afile.dat");
    cout << "Writing to the file" << endl;
    cout << "Enter your name: ";
    cin.getline(data, 100);
    // 입력된 데이터를 파일에 쓰기
    outfile << data << endl;
    cout << "Enter your age: ";
    cin >> data;
    cin.ignore();
    // 다시 입력된 데이터를 파일에 쓰기
    outfile << data << endl;
    // 열린 파일 닫기
    outfile.close();
    // 읽기 모드로 파일 열기
    ifstream infile;
    infile.open("afile.dat");
    cout << "Reading from the file" << endl;
    infile >> data;
    // 데이터를 화면에 출력
    cout << data << endl;
    // 다시 파일에서 데이터 읽어 표시
    infile >> data;
    cout << data << endl;
    // 열린 파일 닫기
    infile.close();
    return 0;
}

위 코드를 컴파일하고 실행하면 샘플 입출력은 다음과 같습니다.

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

위 예제는 cin 객체의 추가 함수들, 즉 외부에서 줄을 읽는 getline() 함수와 이전 읽기 문장이 남긴 여분 문자를 무시하는 ignore() 함수를 사용합니다.

파일 위치 포인터

istream과 ostream 모두 파일-위치 포인터를 재배치하기 위한 멤버 함수를 제공합니다. 이 멤버 함수들은 istream용 seekg("seek get")와 ostream용 seekp("seek put")입니다.

seekg와 seekp의 인자는 보통 long 정수입니다. 두 번째 인자로 탐색 방향을 지정할 수 있습니다. 탐색 방향은 스트림 시작 기준 상대 위치인 ios::beg(기본값), 스트림 내 현재 위치 기준 상대 위치인 ios::cur, 스트림 끝 기준 상대 위치인 ios::end가 있습니다.

파일-위치 포인터는 파일의 시작 위치로부터 바이트 수로 위치를 지정하는 정수 값입니다. "get" 파일-위치 포인터 위치 지정 예:

// fileObject의 n번째 바이트 위치 (ios::beg 가정)
fileObject.seekg(n);
// fileObject에서 n 바이트 앞으로
fileObject.seekg(n, ios::cur);
// fileObject 끝에서 n 바이트 뒤로
fileObject.seekg(n, ios::end);
// fileObject 끝 위치
fileObject.seekg(0, ios::end);

C 언어

  1. C++ 변수, 리터럴, 상수 마스터하기: 종합 가이드
  2. C++ 클래스와 객체: 객체지향 프로그래밍 실전 가이드
  3. C++ 프렌드 함수와 프렌드 클래스: 접근 제어 마스터하기
  4. C 파일 입출력: fopen, fprintf, fread, fseek 마스터하기
  5. Python 디렉터리 및 파일 관리 마스터하기
  6. C++ 구조체 vs 클래스: 임베디드 개발자를 위한 실용 가이드
  7. C 헤더 파일 이해: 유형, 사용법, 모범 사례
  8. C++ 날짜와 시간 완벽 가이드: ctime 라이브러리 활용
  9. C++ 오버로딩 마스터하기: 함수 & 연산자 오버로딩 완전 정복
  10. 밀 파일(Mill File) 완벽 가이드: 목공·금속 마감 필수 도구