본문 바로가기

코딩/객체지향프로그래밍

[C++] String, File - 문자열과 파일 (2)

출처: https://commons.wikimedia.org/wiki/File:File-folders.jpg

 


 

1.  입/출력을 보기 좋게 하기 위한 부가기능

  • .width( ): 데이터를 표시할 칸 수를 지정하고 우측 정렬함 (=iomanip의 setw( )와 동일)
  • .precision( ): 소수점 뒤에 표시할 수 있는 숫자 개수(자릿수)를 제한함 (유효자리숫자)
  • .fill( ): 공백 채워줌 (char만)
#include <iostream>
#include <fstream>
using namespace std;

int main() {
	char ch; //스페이스바(white space)는 문자로 취급x

	cin.unsetf(ios::skipws); //ws를 skip하는 기능 unset(끔) -> 공백 입력 받음
	cin >> ch;
	cout << '(' << ch << ')' << endl;

	cin.setf(ios::skipws); //기능 set(켬) -> 공백 skip
	cin >> ch;
	cout << '(' << ch << ')' << endl;

	ofstream fout;
	fout.open("temp.txt");
	int a = 123;
    double b = 12.3456789;

	fout.width(15);
	fout << a << endl;
	fout.width(15);
	fout.precision(10);
	fout << b << endl;

	cout.width(15);
	cout.precision(4);
	cout.fill('-');
	cout << b << endl;

	return 0;
}

 

 

 

2. File Streaming 총정리 및 응용

- 프로그램에 대한 전체 sketch

  1. ch7STUFL.DAT 파일로부터 학생 정보를 한 줄씩 읽는다 (id, score1, score2, score3)
  2. score1, score2, score3를 평균 내고, 평균값(avg)으로 성적(grade)을 구한다.
  3. grade.txt에 id, avg, grade를 저장한다.
#include <iostream>
#include <string>
#include <fstream> // ifstream ofstream
using namespace std;

//file의 끝을 읽었는지 아닌지에 따라 T/F값을 반환하므로 함수 bool type
//main함수로 보내주기 위해서 pass by ref. 걸어줘야 함
//if,ofstream은 reference 안걸면 실행 x, 반드시 걸어주기!! 
    //(어디까지 읽었는지 알고있어야 그 다음줄 읽을 수 있기 때문
    // 계속해서 읽은 위치를 업데이트)
    
bool readStu(ifstream &fin, int &id, int &score1, int &score2, int &score3);

void calcGrade(int score1, int score2, int score3, int &avg, char &grade);

// id, avg, grade 는 & 안걸어줘도 됨 (main에 다시 전달 안해도 되니까)
void writeStu(ofstream &fout, int id, int avg, char grade);

int main() {
    
	ifstream fin("ch7STUFL.DAT");
	ofstream fout("grade.txt");
	int id, score1, score2, score3, avg;
	char grade;

	// 예외처리, 읽거나 쓰는 파일 error시
	if (!fin | !fout) {
		cout << "Flie open error" << endl;
		exit(100);
	}

	// getline(fin, s) string대신 int면 읽어서 int로 저장
	while (readStu(fin, id, score1, score2, score3)) {
		calcGrade(score1, score2, score3, avg, grade);
		writeStu(fout, id, avg, grade);
	}

	cout << "Finish" << endl;


	fin.close();
	fout.close();

	return 0;
}

bool readStu(ifstream &fin, int &id, int &score1, int &score2, int &score3) {
	fin >> id >> score1 >> score2 >> score3; // ws단위로 끊어 읽음
	if (!fin)
		return false; // main함수의 while문 종료
	else
		return true;
}

void calcGrade(int score1, int score2, int score3, int &avg, char &grade) {
	avg = (score1 + score2 + score3) / 3;
	if (avg >= 90)
		grade = 'A';
	else if (avg >= 80)
		grade = 'B';
	else if (avg >= 70)
		grade = 'C';
	else if (avg >= 60)
		grade = 'D';
	else
		grade = 'F';
}

void writeStu(ofstream &fout, int id, int avg, char grade) {
	fout.width(4);
	fout.fill('0'); // id를 string으로 받으면 0090까지 한꺼번에 저장
	fout << id;

	fout.width(3);
	fout.fill(' '); // 위에서 공백에 0을 넣어줘서 그밑으로 다 0들어가니까
	fout << avg;
	
	fout.width(2);
	fout << grade << endl;
}
  • cout은 객체이자 instance
  • ex) string s → string은 객체이자 class / s는 객체이자 instance

 


 

*)sample codes: https://github.com/halterman/CppBook-SourceCode

 

 

반응형