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
- ch7STUFL.DAT 파일로부터 학생 정보를 한 줄씩 읽는다 (id, score1, score2, score3)
- score1, score2, score3를 평균 내고, 평균값(avg)으로 성적(grade)을 구한다.
- 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
반응형
'코딩 > 객체지향프로그래밍' 카테고리의 다른 글
[C++] 포인터, 벡터, 배열 (2) (0) | 2020.07.29 |
---|---|
[C++] 포인터, 벡터, 배열 (1) (0) | 2020.07.27 |
[C++] String, File - 문자열과 파일 (1) (0) | 2020.07.23 |
[C++] 조건문과 반복문 (2) (0) | 2020.07.21 |
[C++] 조건문과 반복문 (1) (0) | 2020.07.18 |