C++ 파일과 스트림
안녕하세요, 미래의 프로그래머 여러분! 오늘, 우리는 C++ 파일과 스트림의 세계로 흥미로운 여행을 떠날 거예요. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 모험을 안내해 드릴 거예요. 믿어좀요, 이 수업이 끝날 때까지 여러분은 파일을 전문가처럼 다룰 수 있을 거예요!
파일 열기
기본적인 것부터 시작해요. 여러분이 보물 상자(이것이 우리의 파일이에요)가 있고, 그 안에 무언가를 넣거나 꺼내기 위해 열어야 한다고 상상해봐요. C++에서는 파일과 상호작용하기 위해 "스트림"이라는 것을 사용해요.
파일을 열기 위해서는, 읽기(입력)는 ifstream
클래스를 사용하고, 쓰기(출력)는 ofstream
클래스를 사용해요. 두 가지 모두 하고 싶다면, fstream
클래스를 사용할 수 있어요.
이렇게 파일을 열어요:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ofstream myFile("treasure.txt");
if (myFile.is_open()) {
cout << "보물 상자가 열렸어요!" << endl;
} else {
cout << "아니요! 보물 상자를 열 수 없어요." << endl;
}
return 0;
}
이 예제에서는 "treasure.txt"라는 파일을 쓰기 위해 열려고 해요. is_open()
함수는 파일이 성공적으로 열렸는지 확인해요.
파일 닫기
보물 상자를 사용한 후, 깨끗이 닫는 것은 예의(그리고 좋은 관행)입니다. C++에서 파일은 파일 스트림 객체가 범위를 벗어나면 자동으로 닫히지만, 명시적으로 닫는 것이 더 좋아요:
myFile.close();
파일에 쓰기
이제 보물 상자를 열었으니, 보물을 넣어봅시다! 파일에 쓰는 것은 <<
연산자를 사용하는 것만큼 쉬워요:
ofstream myFile("treasure.txt");
if (myFile.is_open()) {
myFile << "금화: 100" << endl;
myFile << "마법 지팡이: 3" << endl;
myFile << "용의 알: 1" << endl;
cout << "보물이 상자에 추가되었어요!" << endl;
} else {
cout << "보물 상자를 열 수 없어요." << endl;
}
myFile.close();
이 예제에서는 파일에 세 줄을 씁니다. 각 <<
연산자는 파일에 다음 텍스트를 쓰고, endl
은 새 줄을 추가해요.
파일에서 읽기
파일에서 읽는 것은 보물 상자의 재고를 취향하는 것과 같아요. 우리는 ifstream
클래스와 >>
연산자를 사용하여 파일에서 읽어요:
#include <string>
ifstream myFile("treasure.txt");
string line;
if (myFile.is_open()) {
while (getline(myFile, line)) {
cout << line << endl;
}
myFile.close();
} else {
cout << "보물 상자를 열 수 없어요." << endl;
}
여기서는 getline()
를 사용하여 파일의 각 줄을 읽고 콘솔에 출력합니다. while
루프는 파일의 끝에 도달할 때까지 계속됩니다.
읽고 쓰기 예제
읽고 쓰는 것을 더 복잡한 예제에서 결합해 봅시다. 우리는 보물 재고를 관리하는 프로그램을 만들어 보겠습니다:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
// 파일에 쓰기
ofstream outFile("inventory.txt");
if (outFile.is_open()) {
outFile << "금화: 100" << endl;
outFile << "마법 지팡이: 3" << endl;
outFile << "용의 알: 1" << endl;
outFile.close();
cout << "재고가 저장되었어요!" << endl;
} else {
cout << "재고를 저장할 수 없어요." << endl;
return 1;
}
// 파일에서 읽기
ifstream inFile("inventory.txt");
string item;
int count;
if (inFile.is_open()) {
cout << "현재 재고:" << endl;
while (inFile >> item >> count) {
cout << item << " " << count << endl;
}
inFile.close();
} else {
cout << "재고를 읽을 수 없어요." << endl;
return 1;
}
return 0;
}
이 예제에서는 먼저 재고를 파일에 씀 다음, 다시 읽어서 출력합니다. >>
를 사용하여 단어와 숫자를 별도로 읽는 것을 알 수 있습니다.
파일 위치 포인터
책을 읽고 있는 중에 현재 위치를 추적하고 싶다고 생각해봤어요. 파일 위치 포인터는 파일에 대해 정확히 그렇게 합니다. 파일에서 우리의 위치를 추적합니다.
다음은 파일 위치 포인터를 작업할 때 유용한 몇 가지 함수입니다:
함수 | 설명 |
---|---|
tellg() |
입력용으로 현재 get 포인터의 위치를 반환합니다 |
tellp() |
출력용으로 현재 put 포인터의 위치를 반환합니다 |
seekg() |
get 포인터의 위치를 설정합니다 |
seekp() |
put 포인터의 위치를 설정합니다 |
예제를 살펴보죠:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
fstream file("treasure_map.txt", ios::in | ios::out);
if (!file.is_open()) {
cout << "보물 지도를 열 수 없어요!" << endl;
return 1;
}
// 파일에 쓰기
file << "X는 그 자리에 있어요!";
// 파일의 시작으로 이동
file.seekg(0, ios::beg);
// 내용을 읽기
string content;
getline(file, content);
cout << "지도에는 이렇게 적혀 있어요: " << content << endl;
// 시작에서 2 문자 이동
file.seekp(2, ios::beg);
// 내용 일부를 덮어쓰기
file << "항상 그 자리는 아니에요";
// 시작으로 이동하고 다시 읽기
file.seekg(0, ios::beg);
getline(file, content);
cout << "지금 지도에는 이렇게 적혀 있어요: " << content << endl;
file.close();
return 0;
}
이 예제에서는 파일에 쓰고, 다시 읽고, 일부 내용을 수정한 후, 다시 읽습니다. 마치 우리가 보물 지도를 업데이트하는 것과 같아요!
그리고 그렇게 끝났어요, C++ 영역의 용감한 탐험자 여러분! 여러분은 파일(보물 상자)를 열고, 데이터(보물)를 저장하고, 데이터를 읽고, 심지어 파일 내용을 조작하는 것까지 배웠어요. 연습이 실력을 만든다는 것을 기억하고, 코딩하고 탐험을 계속하세요. 다음에 발견할 디지털 보물은 무엇일까요? 코딩을 즐겁게!
Credits: Image by storyset