C++ 파일 및 스트림


지금까지 표준 입력에서 스트림을 읽고 스트림을 표준 출력에 쓰기 위해 각각 cincout 메서드를 제공하는 iostream 표준 라이브러리를 사용했습니다.

이 튜토리얼에서는 파일에서 스트림을 읽고 쓰는 방법을 설명합니다. 이를 위해서는 세 가지 새로운 데이터 유형

data typeofstreamfstream
description
을 정의하는 C++ 의 또 다른 표준 라이브러리를 사용해야 합니다. 파일을 저장하고 파일에 정보를 씁니다.
ifstream이 데이터 유형은 입력 파일 스트림을 나타내며 파일에서 정보를 읽는 데 사용됩니다.
fstream이 데이터 유형은 일반적으로 파일 스트림을 나타내며 ofstream 및 ifstream 기능을 모두 갖습니다. 즉, 파일을 생성하고, 파일에 정보를 쓰고, 파일에서 정보를 읽을 수 있습니다.

C++에서 파일 처리를 수행하려면 헤더 파일 <iostream> 및 <fstream>이 C++ 소스 코드 파일에 포함되어야 합니다.

파일 열기

파일에서 정보를 읽거나 쓰려면 먼저 파일을 열어야 합니다. ofstreamfstream 개체를 사용하여 쓰기 작업을 위해 파일을 열 수만 있다면 ifstream 개체를 사용하세요.

다음은 fstream, ifstream 및 ofstream 객체의 멤버인 open() 함수의 표준 구문입니다.

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

여기서 open() 멤버 함수의 첫 번째 매개변수는 열려는 파일의 이름과 위치를 지정하고, 두 번째 매개변수는 파일이 열리는 모드를 정의합니다.

모드 플래그설명
ios::app추가 모드. 모든 쓰기는 파일 끝에 추가됩니다.
ios::ate파일을 연 후 파일 맨 끝에 위치하게 됩니다.
ios::in읽을 파일을 엽니다.
ios::out쓰기용 파일을 엽니다.
ios::trunc파일이 이미 존재하는 경우 파일을 열기 전에 해당 내용이 잘립니다. 즉, 파일 길이가 0으로 설정됩니다.

위의 두 가지 이상의 모드를 결합할 수 있습니다. 예를 들어, 쓰기 모드로 파일을 열고 파일이 이미 존재하는 경우 파일을 자르려면 다음 구문을 사용할 수 있습니다.

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

마찬가지로, 읽기 및 쓰기용으로 파일을 열려면 , 다음 구문을 사용할 수 있습니다:

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

Close files

C++ 프로그램이 종료되면 자동으로 모든 스트림을 닫고 플러시하며 할당된 메모리를 모두 해제하고 열려 있는 모든 파일을 닫습니다. 그러나 프로그래머는 프로그램이 종료되기 전에 열려 있는 모든 파일을 닫는 좋은 습관을 길러야 합니다.

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

void close();

파일에 쓰기

C++ 프로그래밍에서는 화면에 정보를 출력하기 위해 이 연산자를 사용하는 것과 마찬가지로 스트림 삽입 연산자( << )를 사용하여 파일에 정보를 씁니다. 유일한 차이점은 여기서는 cout 개체 대신 ofstream 또는 fstream 개체를 사용한다는 것입니다.

파일 읽기

C++ 프로그래밍에서는 스트림 추출 연산자( >> )를 사용하여 키보드에서 정보를 입력하는 것처럼 파일에서 정보를 읽습니다. 유일한 차이점은 여기서는 cin 개체 대신 ifstream 또는 fstream 개체를 사용한다는 것입니다.

읽기 및 쓰기 예제

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

#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() 함수는 이전 읽기 문에서 남겨진 추가 문자를 무시합니다.

파일 위치 포인터

istreamostream 모두 파일 위치 포인터를 재배치하기 위한 멤버 함수를 제공합니다. 이러한 멤버 함수에는 istream의 경우 seekg("seek get"), ostream의 경우 seekp("seek put")이 포함됩니다.

seekg 및 seep의 매개변수는 일반적으로 긴 정수입니다. 두 번째 매개변수는 검색 방향을 지정하는 데 사용할 수 있습니다. 검색 방향은 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 );