1. 텍스트 파일 (Text Files)
- 텍스트 파일은 인간이 읽을 수 있는 문자로 이루어진 파일입니다. 일반적으로 텍스트 파일은 텍스트 편집기로 열면 읽을 수 있고, 예를 들어 텍스트 문서 (txt), 소스 코드 파일 (cpp, py, java 등), CSV 파일 등이 포함됩니다.
- 텍스트 파일의 데이터는 문자열 형태로 저장되며, 각 문자는 문자 인코딩 (예: UTF-8, ASCII)을 사용하여 저장됩니다.
- 파일 입출력 시 텍스트 파일을 읽고 쓸 때 문자열을 다루는 방법을 사용합니다.
2. 바이너리 파일 (Binary Files)
- 바이너리 파일은 텍스트 파일과 달리 텍스트 형식이 아닌 이진 형태로 데이터가 저장되는 파일입니다. 이진 데이터는 사람이 직접 읽을 수 없습니다.
- 바이너리 파일은 이미지, 오디오, 비디오, 실행 가능한 프로그램 등과 같은 모든 종류의 데이터를 저장할 수 있습니다.
- 파일 입출력 시 바이너리 파일은 바이트 배열로 다루며, 특정 데이터 형식을 이해하고 처리해야 합니다.
바이너리 입출력을 다루기 위해 일반적으로 사용되는 함수와 개념
1. 파일 열기 (Opening a Binary File):
- 바이너리 파일을 열기 위해 파일을 이진 모드(binary mode)로 열어야 합니다. 이를 위해 파일을 읽기 모드(`'rb'`), 쓰기 모드(`'wb'`), 이어쓰기 모드(`'ab'`)로 열 수 있습니다.
2. 데이터 읽기 (Reading Binary Data):
- 바이너리 파일에서 데이터를 읽을 때는 파일 객체의 `read()` 함수를 사용합니다. `read()` 함수는 바이트(byte) 단위로 데이터를 읽습니다.
- 읽은 데이터는 바이트 배열 또는 바이트 객체로 반환됩니다.
3. 데이터 쓰기 (Writing Binary Data):
- 바이너리 파일에 데이터를 쓸 때는 파일 객체의 `write()` 함수를 사용합니다. `write()` 함수는 바이트 데이터를 파일에 씁니다.
4. 파일 닫기 (Closing the File):
- 바이너리 파일을 다룬 후에는 파일을 명시적으로 닫는 것이 중요합니다. 파일을 닫으면 파일 자원을 해제하고 데이터 손실을 방지할 수 있습니다.
- 대부분의 프로그래밍 언어에서는 파일을 닫기 위한 명시적인 메서드 또는 구문을 제공합니다.
바이너리 입출력을 사용할 때는 데이터의 형식과 크기를 신중하게 다루어야 합니다. 잘못된 데이터 읽기 또는 쓰기는 파일 손상과 데이터 손실을 초래할 수 있으므로 주의가 필요합니다.
바이너리 입출력을 C++로 다루기 위해 사용되는 주요 함수는 `<fstream>` 라이브러리에서 제공됩니다. 아래 예시에서는 C++을 사용하여 바이너리 파일을 열고 읽는 방법을 보여줍니다.
#include <iostream>
#include <fstream>
int main() {
// 바이너리 파일을 읽기 모드로 엽니다.
std::ifstream inputFile("binaryfile.bin", std::ios::binary);
// 파일이 성공적으로 열렸는지 확인합니다.
if (!inputFile) {
std::cerr << "파일을 열 수 없습니다." << std::endl;
return 1;
}
// 파일에서 데이터를 읽습니다.
char data[10]; // 읽을 데이터를 저장할 배열
inputFile.read(data, sizeof(data));
// 파일을 닫습니다.
inputFile.close();
// 읽은 데이터를 처리합니다.
for (int i = 0; i < sizeof(data); i++) {
std::cout << "바이트 " << i << ": " << (int)data[i] << std::endl;
}
return 0;
}
이 예제에서는 `<fstream>` 헤더를 사용하여 `std::ifstream` 클래스를 통해 바이너리 파일을 열고 `read()` 함수를 사용하여 데이터를 읽습니다. `std::ios::binary` 플래그를 사용하여 이진 모드로 파일을 열었습니다.
C++에서도 파일을 닫기 위해 `close()` 함수를 호출하여 파일을 닫아야 합니다. 이렇게 하면 파일을 다루는 동안 발생할 수 있는 문제를 방지할 수 있습니다.
바이너리 데이터를 처리할 때는 데이터 형식과 크기에 주의해야 합니다. 데이터를 올바르게 읽고 쓰려면 데이터 형식을 정확히 이해하고 그에 맞게 다루어야 합니다.
C++의 파일 처리에서 임의 접근(Sequential Access)과 스트림 상태 검사(Stream State Checking)는 파일을 읽고 쓸 때 중요한 개념
1. 임의 접근 (Sequential Access):
- 임의 접근은 파일의 데이터를 순차적으로 읽거나 쓰는 것을 의미합니다. 이것은 파일의 처음부터 끝까지 데이터를 연속적으로 처리하는 방식입니다.
- C++에서는 `std::ifstream` (파일 읽기) 또는 `std::ofstream` (파일 쓰기)를 사용하여 파일을 연 후, 데이터를 순차적으로 읽거나 쓸 수 있습니다.
- 예를 들어, 파일을 순차적으로 읽는 C++ 코드는 다음과 같습니다:
#include <iostream>
#include <fstream>
int main() {
std::ifstream inputFile("data.txt");
if (!inputFile) {
std::cerr << "파일을 열 수 없습니다." << std::endl;
return 1;
}
std::string line;
while (std::getline(inputFile, line)) {
std::cout << line << std::endl;
}
inputFile.close();
return 0;
}
2. 스트림 상태 검사 (Stream State Checking):
- 파일을 다룰 때 스트림의 상태를 주의 깊게 검사하는 것은 중요합니다. 스트림 상태를 확인하여 파일 작업 중에 오류를 탐지하고 처리할 수 있습니다.
- C++에서는 `fail()`, `eof()`, `bad()` 등의 스트림 멤버 함수를 사용하여 스트림 상태를 검사합니다.
- `fail()`: 스트림에서 오류가 발생한 경우 `true`를 반환하며, 그렇지 않으면 `false`를 반환합니다.
- `eof()`: 스트림에서 파일의 끝에 도달한 경우 `true`를 반환하며, 그렇지 않으면 `false`를 반환합니다.
- `bad()`: 스트림에서 심각한 오류가 발생한 경우 `true`를 반환하며, 그렇지 않으면 `false`를 반환합니다.
- 예를 들어, 파일에서 데이터를 읽을 때 스트림 상태를 확인하는 C++ 코드는 다음과 같습니다:
#include <iostream>
#include <fstream>
int main() {
std::ifstream inputFile("data.txt");
if (!inputFile) {
std::cerr << "파일을 열 수 없습니다." << std::endl;
return 1;
}
std::string line;
while (std::getline(inputFile, line)) {
if (inputFile.fail()) {
std::cerr << "파일에서 읽을 수 없습니다." << std::endl;
break;
}
std::cout << line << std::endl;
}
if (inputFile.eof()) {
std::cout << "파일의 끝에 도달했습니다." << std::endl;
}
inputFile.close();
return 0;
}
스트림 상태 검사를 통해 파일 작업 중 오류를 탐지하고 적절하게 처리하여 안정성을 높일 수 있습니다.