영넌 개발로그
[C++ File] fstream I/O (ofstream, ifstream) 본문
파일을 이용한 input, output을 작성해보자
헤더는 #include <fstream> 이 필요하다. 파일을 읽을 때는 ifistream 클래스, 파일을 쓸 때는 ofstream 클래스를 사용해도 된다.
fstream 클래스의 f라는 객체를 만들어 0~9 까지 숫자를 쓰는 코드이다. 읽거나 쓰는 것에 대한 모드를 지정해주어야한다. 이는 std::ios::out 이나 std::ios::in 으로 작성한다.
파일 쓰기>
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream f("test_1.txt", ios::out);
if (!f) {
cout << "Unable to open file" << endl;
exit(1);
}
for (int i = 0; i < 10; i++) {
f << i << endl;
}
}
파일 읽기>
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream f("text_1.txt", ios::in);
if (!f) {
cout << "Unable to open file" << endl;
exit(1);
}
int num;
while (f) {
f >> num;
cout << num << endl;
}
}
ofstream
output file stream을 의미한다. output 이라고 지정되어있는 클래스이므로 모드를 지정할 필요가 없다.
기존에 파일이 있을 경우, 그 뒤에 이어쓰거나 위에 겹쳐 쓰는 모드를 설정할 수 있다.
이어쓰는 경우 std::ios::app (append)
엎어쓰는 경우 std::ios::trunc (overwrite)
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream f("test_2.txt");
if (!f) {
cout << "Unable to open file" << endl;
exit(1);
}
for (int i = 0; i < 20; i++) {
f << i << endl;
}
}
ifstream
input file stream을 의미한다. input 이라고 지정되어있는 클래스이므로 모드를 지정할 필요가 없다.
f.eof() == false 를 쓰는 이유
eof는 end of file 이라를 뜻이다. 이 때, 파일의 끝일 때에도 f는 true를 반환하므로 while(f) 라고만 써두게 되면 끝에 적힌 숫자가 한 번 더 출력이 되게 된다.
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f("text_1.txt");
if (!f) {
cout << "Unable to open file" << endl;
exit(1);
}
int num;
while (f.eof() == false) {
f >> num;
cout << num << endl;
}
}
연습>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
class BioData {
public:
int idx;
float height;
float weight;
public:
BioData(int _i, float _h, float _w) : idx(_i), height(_h), weight(_w) {};
void printData();
};
void BioData::printData() {
cout << idx << height << weight << endl;
}
vector<BioData> DB;
int main() {
ifstream input_file("data.txt");
if (!input_file) {
cout << "Unable to open" << endl;
exit(1);
}
int idx;
float height;
float weight;
while (input_file.eof() ==false) {
input_file >> idx >> height >> weight;
DB.push_back(BioData(idx, height, weight));
}
double mean_h = 0.0;
double mean_w = 0.0;
for (auto& e : DB) {
mean_h += e.height;
mean_w += e.weight;
e.printData();
}
cout << "평균 키는 " << mean_h / DB.size() << endl;
cout << "평균 체중은 " << mean_w / DB.size() << endl;
}
fstream의 method 활용
get( ) : read by character
put( ) : write by character
int main() {
ifstream input_file("data.txt");
ofstream output_file("data_copy.txt");
if (input_file.fail() == true) {
cout << "Unable to open input" << endl;
exit(0);
}
if (output_file.fail() == true) {
cout << "Unable to open output" << endl;
exit(0);
}
char c;
while (input_file.eof() == false) {
input_file.get(c);
output_file.put(c);
//input_file >> c;
//output_file <<c; 이렇게 하면 줄바꿈이나 띄어쓰기가 무시됨
}
string s;
while (input_file.eof() == false) {
getline(input_file, s); //줄바꿈은 날라감
output_file << s << '\n' ;
}
}
'코딩 > C++' 카테고리의 다른 글
[C ++ 기초] 예외 처리 exception handling (try - catch) (0) | 2020.12.06 |
---|---|
[C++ File] text file VS binary file / file pointer (0) | 2020.12.06 |
[C++ 기초] Virtual function (destructor, pure) (0) | 2020.12.06 |
[C++ 기초] Inheritance 상속이란? / Multiple inheritance 다중상속? (0) | 2020.12.06 |
Comments