C++ 초급 - 추가 내용 (심화 학습) (2 - 파일 입출력 (fstream))
2025. 2. 22. 18:32ㆍ프로그래밍 언어/C++
📌 2. 파일 입출력 (fstream)
C++에서는 파일을 읽고 쓰기 위해 fstream 라이브러리를 사용한다.
이를 활용하면 텍스트 파일과 바이너리 파일을 다룰 수 있으며, 데이터 저장 및 로깅이 가능하다.
📌 2.1 파일 스트림 (std::ifstream, std::ofstream, std::fstream) 기본 사용법
C++의 파일 입출력은 세 가지 주요 클래스를 사용한다.
파일 스트림 | 클래스 설명 |
std::ifstream | 파일을 읽기 모드로 염 (ifstream = input file stream) |
std::ofstream | 파일을 쓰기 모드로 염 (ofstream = output file stream) |
std::fstream | 읽기/쓰기 모두 가능 (fstream = file stream) |
💡 예제: 파일 스트림 기본 사용법
#include <iostream>
#include <fstream>
int main() {
std::ofstream outFile("example.txt"); // 파일 생성 및 열기 (쓰기 모드)
outFile << "Hello, C++ File IO!" << std::endl; // 파일에 쓰기
outFile.close(); // 파일 닫기
std::ifstream inFile("example.txt"); // 파일 열기 (읽기 모드)
std::string line;
std::getline(inFile, line); // 파일에서 한 줄 읽기
std::cout << "파일 내용: " << line << std::endl;
inFile.close(); // 파일 닫기
return 0;
}
🔹 출력 결과 (example.txt에 저장된 내용)
파일 내용: Hello, C++ File IO!
💡 설명
- std::ofstream → 파일 생성 및 쓰기
- std::ifstream → 파일 읽기
- close()를 사용하여 파일 닫기 (자원 관리)
📌 2.2 텍스트 파일 읽기/쓰기 (open(), close(), getline())
텍스트 파일 입출력은 줄 단위(getline()), 단어 단위(>>), 문자 단위(get())로 읽을 수 있다.
🔹 (1) 텍스트 파일 쓰기 (std::ofstream)
💡 예제: 텍스트 파일 생성 및 데이터 쓰기
#include <iostream>
#include <fstream>
int main() {
std::ofstream file("data.txt"); // 파일 열기 (쓰기 모드)
if (!file) {
std::cerr << "파일을 열 수 없습니다!" << std::endl;
return 1;
}
file << "이것은 C++ 파일 입출력 예제입니다." << std::endl;
file << "파일에 여러 줄을 쓸 수 있습니다." << std::endl;
file.close(); // 파일 닫기
return 0;
}
🔹 출력 결과 (data.txt 파일 내용)
이것은 C++ 파일 입출력 예제입니다.
파일에 여러 줄을 쓸 수 있습니다.
🔹 (2) 텍스트 파일 읽기 (std::ifstream)
💡 예제: 파일에서 한 줄씩 읽기 (getline())
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream file("data.txt"); // 파일 열기 (읽기 모드)
if (!file) {
std::cerr << "파일을 열 수 없습니다!" << std::endl;
return 1;
}
std::string line;
while (std::getline(file, line)) { // 한 줄씩 읽기
std::cout << line << std::endl;
}
file.close();
return 0;
}
🔹 출력 결과
이것은 C++ 파일 입출력 예제입니다.
파일에 여러 줄을 쓸 수 있습니다.
💡 설명
- std::getline(file, line) → 한 줄씩 읽음
- 파일이 끝날 때까지 while 루프로 읽기 가능
📌 2.3 바이너리 파일 읽기/쓰기 (read(), write())
바이너리 파일은 텍스트 파일과 달리, 데이터를 read()와 write()로 직접 처리해야 한다.
🔹 (1) 바이너리 파일 쓰기 (std::ofstream)
💡 예제: 바이너리 파일에 데이터 저장
#include <iostream>
#include <fstream>
struct Data {
int id;
double value;
};
int main() {
Data d = {1, 99.99};
std::ofstream file("binary.dat", std::ios::binary); // 바이너리 모드로 파일 열기
file.write(reinterpret_cast<char*>(&d), sizeof(Data));
file.close();
return 0;
}
🔹 설명
- std::ios::binary → 바이너리 모드로 파일 열기
- write(reinterpret_cast<char*>(&d), sizeof(Data)) → 데이터를 바이너리로 저장
🔹 (2) 바이너리 파일 읽기 (std::ifstream)
💡 예제: 바이너리 파일에서 데이터 읽기
#include <iostream>
#include <fstream>
struct Data {
int id;
double value;
};
int main() {
Data d;
std::ifstream file("binary.dat", std::ios::binary);
file.read(reinterpret_cast<char*>(&d), sizeof(Data));
file.close();
std::cout << "ID: " << d.id << ", Value: " << d.value << std::endl;
return 0;
}
🔹 출력 결과
ID: 1, Value: 99.99
💡 설명
- read(reinterpret_cast<char*>(&d), sizeof(Data)) → 바이너리 데이터 읽기
📌 2.4 파일 스트림의 예외 처리 (exceptions(), fail())
파일이 존재하지 않거나 권한이 없을 경우 예외 처리를 해야 한다.
💡 예제: 파일 스트림의 예외 처리 (fail(), exceptions())
#include <iostream>
#include <fstream>
int main() {
std::ifstream file("nonexistent.txt");
if (!file) {
std::cerr << "파일을 열 수 없습니다!" << std::endl;
return 1;
}
std::string content;
file >> content; // 읽기 시도
if (file.fail()) {
std::cerr << "파일 읽기 실패!" << std::endl;
}
return 0;
}
🔹 출력 결과 (파일이 없을 경우)
파일을 열 수 없습니다!
💡 설명
- if (!file) → 파일이 존재하는지 확인
- file.fail() → 읽기 실패 여부 확인
📌 2.5 파일을 활용한 데이터 저장 및 로깅 구현
💡 예제: 로그 파일 작성 (log.txt에 저장)
#include <iostream>
#include <fstream>
#include <ctime>
void logMessage(const std::string& message) {
std::ofstream logFile("log.txt", std::ios::app); // 기존 파일에 추가 (append 모드)
if (!logFile) {
std::cerr << "로그 파일을 열 수 없습니다!" << std::endl;
return;
}
std::time_t now = std::time(nullptr);
logFile << std::ctime(&now) << " - " << message << std::endl;
}
int main() {
logMessage("프로그램 시작");
logMessage("데이터 처리 중...");
logMessage("프로그램 종료");
return 0;
}
🔹 출력 결과 (log.txt 파일)
Mon Feb 12 14:30:45 2024 - 프로그램 시작
Mon Feb 12 14:30:46 2024 - 데이터 처리 중...
Mon Feb 12 14:30:47 2024 - 프로그램 종료
📌 3. 정리
기능 | 설명 |
텍스트 파일 입출력 | std::ifstream, std::ofstream, std::getline() 활용 |
바이너리 파일 입출력 | read(), write(), reinterpret_cast 활용 |
파일 예외 처리 | fail(), exceptions()를 활용한 에러 처리 |
로그 시스템 | 파일을 활용한 데이터 저장 및 로깅 구현 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 추가 내용 (심화 학습) (4 - 비동기 프로그래밍 (std::thread, std::async)) (0) | 2025.02.22 |
---|---|
C++ 초급 - 추가 내용 (심화 학습) (3 - 람다 함수 (lambda expressions)) (0) | 2025.02.22 |
C++ 초급 - 추가 내용 (심화 학습) (1 - 네임스페이스 (namespace)) (0) | 2025.02.22 |
C++ 초급 - 12. 최신 C++ 기능 소개 (5 - C++23: std::expected 기본 개념) (0) | 2025.02.22 |
C++ 초급 - 12. 최신 C++ 기능 소개 (4 - C++20: concepts와 범위 기반 for 개선) (0) | 2025.02.22 |