728x90
ofstream과 ifstream
- 입출력 스트림으로 파일 입출력도 처리할 수 있다.
- C언어와 마찬가지로 파일이나 콘솔이나 스트림이라는 측면에서는 동일하기 때문에 비슷한 방법으로 처리할 수 있다.
- 다만, C는 함수에 스트림을 참조해서 사용하는 방면, C++은 스트림 객체 자체에서 처리한다.
- C 스타일 파일 입출력
- 파일 입출력에 사용되는 클래스는 ofstream과 ifstream이다.
- ofstream과 ifstream 클래스는 char 타입을 대상으로 하는 파일 입출력 클래스
- wifstream과 wofstream 클래스는 wchar_t 타입을 대상으로 하는 파일 입출력 클래스
- 이 클래스들은 fstream 헤더 파일에 선언되어 있다.
파일 열기 및 닫기
- ofstream 객체 file을 선언하고 open 함수로 출력하려는 파일을 연다.
- open 함수를 호출할 때 열 파일의 경로를 지정하는데 상대 경로를 사용했다(절대 경로도 가능).
- open 함수는 파일이 없으면 새로 생성하고, 이미 존재하는 경우에는 덮어쓴다.
- 객체를 선언하고, open 함수로 파일을 여는 두 과정을 생성자에 경로를 전달하면 한 번에 처리할 수 있다.
- std::ofstream file(”Test.txt”);
#include <iostream>
#include <fstream>
int main()
{
std::ofstream file;
file.open("Test.txt");
std::ofstream file2("Test2.txt");
file.close();
file2.close();
}
- ifstream으로 파일을 읽을 때 파일이 없는 경우, 데이터를 읽으려고 시도하면 오류가 발생한다.
- 이를 위해 is_open 함수를 사용해 파일이 제대로 열렸는지 확인할 수 있다.
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file("Test.txt");
if (file.is_open())
{
std::cout << "파일 열기 성공\n";
}
else
{
std::cout << "파일 열기 실패\n";
}
}
모드
- 파일을 열 때 사용하는 open 함수는 mode를 지정할 수 있도록 설계되어 있다.
- 입출력의 기본 모드가 다르게 설정되어 있는데 입력용은 읽기만 가능하고, 출력용은 쓰기만 가능하도록 기본 값이 설정되어 있다.
- open 함수에 지정된 기본 값을 사용하지 않고, 다른 모드를 사용하려는 경우에는 두 번째 파라미터에 원하는 모드를 전달하면 된다.
- 예를 들어, 입출력을 모두 지정하고 싶으면 in, out 모드를 모두 지정하면 된다.
std::ifstream file("Test.txt", std::ios_base::out);
std::ofstream file("Test.txt", std::ios_base::in);
| 모드 | 설명 |
| ios_base::in | 입력용으로 파일을 연다. |
| ios_base::out | 출력용으로 파일을 연다. |
| ios_base::app | 파일 끝에 데이터를 추가하는 모드로 파일을 연다. 데이터를 추가하는 것만 가능하다. |
| ios_base::ate | 파일을 열자마자 FP를 파일의 끝 위치로 이동시킨다. FP를 임의의 위치로 이동 시킬 수 있다. |
| ios_base::trunc | 파일이 이미 존재하는 경우, 데이터를 모두 지워 크기를 0으로 만든다. |
| ios_base::binary | 텍스트 모드가 아닌, 바이너리 파일 모드로 연다. |
파일 입출력
파일 출력
- 파일에 데이터를 출력할 때는 << 연산자를 사용하는데, 콘솔에서와 마찬가지로 기본 타입에 대해 출력이 가능하며, 예제에서 사용한 것과 같이 연쇄적으로 출력을 처리할 수 있다.
- 파일 사용을 완료했으면 close 함수를 통해 파일을 닫는다.
#include <iostream>
#include <fstream>
int main()
{
std::ofstream file;
file.open("Test.txt");
file << "String " << 123456 << " " << 3.141592 << "\n";
file.close();
}


파일 입력
- 파일 입력을 위해 ifstream 객체를 선언하면서 파일 경로 값을 전달했다. 이렇게 하면 객체 선언 및 open 함수 호출 과정을 줄일 수 있다.
- file로부터 데이터를 읽을 때는 >> 연산자를 사용한다.
- 파일 사용을 완료했으면 close 함수를 통해 파일을 닫는다.
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file("Test.txt");
char stringData[256];
int intData;
float floatData;
file >> stringData >> intData >> floatData;
std::cout << stringData << " " << intData << " " << floatData << "\n";
file.close();
}

- ifstream으로 파일을 읽을 때 파일이 없는 경우, 데이터를 읽으려고 시도하면 오류가 발생한다.
- 이를 위해 is_open 함수를 사용해 파일이 제대로 열렸는지 확인할 수 있다.
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file("Test.txt");
if (file.is_open())
{
std::cout << "파일 열기 성공\n";
}
else
{
std::cout << "파일 열기 실패\n";
}
}
파일의 임의 접근
임의 접근
- FP를 임의의 위치로 이동시킬 때는 다음의 두 함수를 사용할 수 있다.
- 입력용, 출력용 FP를 따로 유지하기 때문에 함수가 2개로 나뉘어 있다.
- 첫 번째 파라미터는 어느 위치로 이동할 것인지를 나타내고 두 번째 파라미터는 이동의 기준점을 나타낸다.
- 두 번째 파라미터
- std::ios_base::beg: 파일의 시작 위치
- std::ios_base::cur: 파일의 현재 위치
- std::ios_base::end: 파일의 끝 위치
- FP를 지정하는 방식은 C의 fseek 함수와 거의 동일하다.
seekg(off_type off, ios_base::seek_dir way); // 입력용 임의 접근 함수.
seekp(off_type off, ios_base::seek_dir way); // 출력용 임의 접근 함수.
파일의 현재 위치 반환
C의 ftell과 같은 기능을 하며 각각 입력용, 출력용 함수를 구분해 제공된다.
int ret = tellg();
int ret = tellp();
파일 읽고 쓰기
파일을 읽고 쓸 때 read와 write 함수를 사용할 수 있다.
basic_istremm& read(char *stream, streamsize size);
basic_ostream& write(const char *stream, streamsize size);
파일 복사
- ifstream 객체를 선언하고, 읽을 파일 경로를 지정했다. 파일의 모드는 기본 값과 동일하지만 추가해 봤다.
- is_open 함수를 통해 파일이 제대로 열렸는 지를 확인한다.
- 이제 읽은 값을 그대로 복제하기 위해 ofstream 객체를 선언하고, 저장할 경로를 지정했다.
- ifstream.read 함수를 사용해 지정한 버퍼의 크기만큼 데이터를 읽고 ofstream.write 함수를 사용해 읽어 들인 버퍼를 파일에 기록한다. 이때 파일로부터 읽어 들인 길이를 확인하기 위해 gcount 함수를 사용했다.
- 파일 입출력을 완료했으면 close 함수를 사용해 파일을 닫는다.
- 파일 액세스 함수들은 항상 파일의 현재 위치(FP)를 참조해 읽는데, 읽고 쓴 후에 FP를 뒤로 이동시키기 때문에 순차적으로 파일에 접근해 작업을 처리할 수 있다.
#include <iostream>
#include <fstream>
int main()
{
std::ifstream source("Test.txt");
if (!source.is_open())
{
std::cout << "파일이 없습니다.\n";
return 0;
}
std::ofstream destination("Test_Copied.txt");
char buffer[256];
int readSize;
while (true)
{
source.read(buffer, 256);
readSize = source.gcount();
if (readSize == 0)
{
break;
}
destination.write(buffer, readSize);
}
source.close();
destination.close();
}
파일 읽고 출력하기 예제
다음과 같은 스테이지 데이터를 파일로 갖고 있다.
이를 파일 입출력을 통해 출력해 보자.

#include <iostream>
#include <fstream>
int main()
{
std::ifstream mapFile("Stage_01.txt");
// 예외 처리
if (!mapFile.is_open())
{
__debugbreak();
return 0;
}
mapFile.seekg(0, std::ios_base::end); // FP를 파일의 끝으로 이동
int fileSize = mapFile.tellg(); // FP의 위치를 읽음 (파일의 크기)
mapFile.seekg(std::ios_base::beg); // FP를 다시 파일의 처음으로 돌림
char* buffer = new char[fileSize + 1]; // 파일의 크기만큼 버퍼 할당
memset(buffer, 0, fileSize + 1);
// read 함수를 사용해 파일의 모든 문자를 버퍼에 저장
mapFile.read(buffer, fileSize);
// gcount 함수를 사용해 파일로부터 읽어 들인 길이를 저장
int readSize = mapFile.gcount();
// 현재 위치
int index = 0;
int posX = 0; // 열
int posY = 0; // 행
// 문자 배열 순회
while (index < readSize)
{
// 맵 문자 확인
char mapCharacter = buffer[index++];
// 개행 문자 처리
if (mapCharacter == '\n')
{
// 다음 줄로 넘기면서, x 좌표 초기화
posX = 0;
++posY;
std::cout << "\n";
continue;
}
// 문자 출력 및 x좌표 증가 처리
std::cout << mapCharacter;
posX++;
}
// 리소스 정리
delete[] buffer;
mapFile.close();
}

728x90
'📕Programming > 📝C/C++' 카테고리의 다른 글
| [C / C++] C 스타일 파일 입출력 (0) | 2025.07.23 |
|---|---|
| [C / C++] static (0) | 2025.07.23 |
| [C / C++] RTTI (0) | 2025.07.23 |
| [C / C++] 스택 & 힙 메모리 할당 과정 (0) | 2025.07.20 |
| [C / C++] 동적 라이브러리 (dynamic link library) (0) | 2025.07.18 |