영넌 개발로그

[C++ File] fstream I/O (ofstream, ifstream) 본문

코딩/C++

[C++ File] fstream I/O (ofstream, ifstream)

영넌 2020. 12. 6. 06:39

파일을 이용한 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' ;
	}

}

Comments