컴공생의 다이어리
[c++] 파일 입출력 본문
fstream
파일 스트림은 기본적인 istream이나 ostream 클래스 보다 더 지원하는 기능이 더 많기 때문에 이를 상속 받아서 작성되었으며, 각각을 상속 받은 것이 ifstream과 ofstream이다. 이들 클래스를 모두 포함하는 라이브러리로 fstream을 사용하면 된다.
#include <fstream>
#include <iostream>
#include <string>
int main() {
// 파일 읽기 준비
std::ifstream in("test.txt");
std::string s;
if (in.is_open()) {
in >> s;
std::cout << "입력 받은 문자열 :: " << s << std::endl;
}
else {
std::cout << "파일을 찾을 수 없습니다!" << std::endl;
}
return 0;
}
ifstream 객체에 생성자에 연동하고자 하는 파일의 경로를 아래와 같이 전달하면 된다.
//상대경로
std::ifstream in1("test.txt");
//절대경로
std::ifstream in2("C:\\a\\b\\test.txt");
위와 같이 생성자에 파일 경로를 지정하면, 해당하는 파일을 찾고 열게 된다. 만일 파일이 존재하지 않는다면 파일을 열 수 없다. 따라서 파일이 열렸는지의 유무는 아래와 같이 is_open함수를 사용하면 된다. 만일 해당 경로에 있는 파일이 존재한다면 true를 존재하지 않는다면 false를 리턴한다.
if(in.is_open){
마지막으로 마치 cin을 사용하는 것처럼 아래와 같은 방법으로 in 객체를 이용해서 파일로부터 데이터를 읽을 수 있다.
in>>s;
c언어에서는 파일 입출력을 한 후에 꼭 fclose를 해주어야 했다. 그런데 c++에서는 그러한 작업을 꼭 하지 않아도 된다. 왜냐하면, 이미 ifstream 객체의 소멸자에서 자동적으로 close를 해주기 때문이다. 다만 close를 직접 해야 하는 경우도 있다. 아래의 코드가 그 예시이다.
#include <fstream>
#include <iostream>
#include <string>
int main() {
// 파일 읽기 준비
std::ifstream in("test.txt");
std::string s;
if (in.is_open()) {
in >> s;
std::cout << "입력 받은 문자열 :: " << s << std::endl;
}
else {
std::cout << "파일을 찾을 수 없습니다!" << std::endl;
}
in.close();
in.open("other.txt");
if (in.is_open()) {
in >> s;
std::cout << "입력 받은 문자열 :: " << s << std::endl;
}
else {
std::cout << "파일을 찾을 수 없습니다!" << std::endl;
}
return 0;
}
아래처럼 새로운 파일에서 같은 객체가 입력을 받기 위해서는 기존 파일 스트림과의 연결을 종료하고, 새로운 파일과 연결을 시켜주면 된다.
in.close();
in.open("other.txt");
기존 파일과의 스트림 종료는 close함수가, 새로운 파일과의 연결은 open함수가 수행하고 있다. open함수가 있기에 굳이 ifstream 객체 생성자에서 파일 경로를 바로 지정해줄 필요가 없고, 나중에 open으로 원하는 파일을 열어도 상관없다.
'Development > C & C++' 카테고리의 다른 글
[c++] 파일에 쓰기 (0) | 2021.01.03 |
---|---|
[c++] 파일 전체 읽기 (0) | 2021.01.03 |
[c++] 형식 플래그(format flag)와 조작자(Manipulator) (0) | 2021.01.03 |
[c++] cin (입력 받기) (0) | 2021.01.02 |
[c++] string 관련 함수 (0) | 2020.12.27 |