ifstream 을 활용한 파일입출력 - fora22/CodingTest GitHub Wiki
- txt 파일을 기준으로 설명한다.
- 본인의 주관적인 경험으로만 작성하는 위키임.
많은 입력이 필요한 경우가 있으면 파일 입출력을 많이 쓴다. 특히 코딩테스트에서는 더 그렇다. 이번에는 C++에서 많이 쓰이는 ifstream 객체에 대해 정리하려고 한다.
ifstream을 풀어쓰면 Input file stream이다. '프로그램에 파일에 있는 어떤 것들을 스트림 버퍼에 가지고 와서 프로그램에 입력한다'라는 뜻이다. 즉, 파일로부터 어떠한 것들을 가지고 와서 프로그램에 입력할 수 있게 도와주는 객체를 말한다.
파일을 열때 open함수가 사용되게 된다. 함수원형은 다음과 같다.
void open(const char* fileName, ios_base::openmode mode = ios_base::in)void open(const string& fileName, ios_base::openmode mode = ios_base::in)
첫 인자로는 open할 파일 이름이 들어가게 된다. 두번째 이자로느 오픈할 모드인데, 오픈할 파일을 어떤 식으로 사용할지에 따라 결정하면 된다. 크게 ios_base::in, ios_base::out, ios_base::binary 등이 있다.
-
ios_base::in: 파일을 read할 목적으로 open -
ios_base::out: 파일을 write할 목적으로 open -
ios_base::binary: 파일을 binary 형태로 open
이외에도 ios_base::ate, app, trunc의 모드가 있다.
보통의 경우 ifstream은 in, ofstream은 out으로 default 값이 들어가 있기 때문에 따로 넣지 않아도 된다.
파일이 열렸는지 확인하는 함수이다. 함수원형은 다음과 같다.
bool is_open() const;
파일과의 연결을 닫아버리는 함수이다. 함수원형은 다음과 같다.
void close();
get 함수는 읽은 파일에서 한char 단위로 일겅서 매개변수로 넣은 c에 넣어주는 함수이다. 함수원형은 다음과 같다.
ifstream& get (char& c);
#include <iostream>
#include <fstream>
using namespace std;
int main(void) {
char c;
ifstream readFile("input.txt");
while(readFile.get(c)) {
//읽은 char가 c에 들어있다.
cout << c;
}
return 0;
}한줄씩 문자열을 읽어서 str에 저장해주는 함수이다. 한줄의 기준은 '\n' 문자열의 끝을 알리는 개행 문자가 올때 까지, 혹은 파일의 끝을 알리는 EOF를 만날때 까지이다. 함수원형은 다음과 같다.
ifstream& getline(char* str, streamsize len);
*위 ifstream::getline() 함수를 사용할때 주의할점은 문자열을 받아오는 형태가 char 타입이기 때문에 string 타입으로 바로 받을 수 없다는 특징이 있다.
string str 선언해서 str.c_str()을 매개변수로 넣어도 되지 않는다.
str.c_str()은 string을 const char* 타입으로 변환을 하기 때문에 첫번째 매개변수로 사용은 불가능하다.
그럼 바로 string 타입으로 얻어오는 방법이 없을까? 바로 헤더에 존재하는 std::getline으로 읽어오면 된다.
#include <iostream>
#include <fstream>
using namespace std;
int main(void) {
string str;
ifstream readFile("input.txt");
while(!readFile.eof()) {
getline(readFile, str);
cout << str << ednl;
}
return 0;
}파일의 끝이 나오면 true를 반환하고 아니면 false를 반환하는 함수이다. eof() 함수가 불리면 커서의 위치를 확인하는 내부 로직에 의해서 파일의 끝에 도착했는지 아닌지를 판단하게 된다. 함수원형은 다음과 같다.
bool eof() const;
ofstream에서는 ifstrea과 똑같은 멤버함수가 많다. open(), is_open(), close() 등. 달라지는 것은 파일을 쓸 수 있는 write() 함수이다.
첫번째 매개변수로 받은 캐릭터 포인터 타입의 문자열의 n만큼의 길이만큼 파일에 wrtie하는 함수이다. 함수원형은 다음과 같다.
ostream& write(const char* str, streamsize n);
#include <iostream>
#include <fstream>
using namespace std;
int main(void) {
ofstream writeFile; //쓸 목적의 파일 선언
writeFile.open("words.txt"); //파일 열기
char arr[11] = "BlockDMask"; //파일에 쓸 문자열
if(writeFile.is_open()) { //파일이 열렸는지 확인
writeFile.write(arr, 10); //파일에 문자열 쓰기
}
writeFile.close(); //파일 닫기
return 0;
}c언어 배열로 나타내는 문자열은 문자열 끝에 '\0'이 들어가 있기 때문에 배열의 "총 길이-1"을 write의 두번째 인자로 넣어야한다(여기서는 arr의 길이가 11이지만 write()에는 10이 들어간 것을 참고).
따라서 "BlockDMask\0"는 char[] 배열의 길이는 11이지만, 실제로 문자는 10개 이므로 10을 넣어야 정상적으로 파일에 씌워진다.
C++ string타입의 문자열로 사용한다면 이런걸 신경쓰지 않아도 되서 매우 편하다.