Notice
Recent Posts
Recent Comments
Link
Yejom's Dev Log
[C++ 입문] 6. file separation, namespace 본문
- 파일 분할 (file separation)
•헤더 파일
•확장자 .h
•클래스, 함수 등의 선언부 코드를 모아두는 곳
•소스 파일
•확장자 .cpp
•클래스, 함수 등의 구현부 코드를 모아두는 곳
- 실습
//1. 사용자에게 몇 명의 학생을 입력할 것인지 묻기
//2. 학생 수 만큼 이름 나이 생일" 순서로 한번에 입력 받기
//3. 1) 학생 정보 출력, 2) 평균 나이, 3) 가장 빠른 생일, 4) 프로그램 종료, 네 가지 기능올 모두 구현
//4. 지금까지 배운 자료구조(배열, 벡터, 리스트), 문자열(스트링) 등 자유롭게 활용 하여 작성 ~작성 전에 어떤 기능을 어떻게 구현할지 먼저 정하고 작성 시작하기~
//5. * 시간이 남으면 * 예외 처리, 주석, 코드 정리 등을 실시하여 완성도를 높이기
// <추가 과제>
// save_st_info() 부분에서 사용자 입력이 올바른지 체크하는 기능을 넣어주세요!
// 이름, 나이, 생년월일에 대한 가이드라인에 맞게 데이터가 들어왔는지 체크를 해주시면 됩니다!
// 문자인지 숫자인지
// 길이는 일치하는지 등
//
// 학생정보 검색 및 수정 기능을 추가해주세요!
// 학생정보 검색 : 1) 이름, 2)나이, 3)생년월일 중 택1 하여 같은 값을 가진 학생 정보 모두 출력!
// 학생정보 수정 : 학생 이름을 입력하면 학생 정보를 출력하고 혹시 같은 이름의 학생이 있다면 1명만 선택하도록 한 뒤, 나이, 생년월일을 입력받아 학생정보 업데이트!
- myFunc.h
#pragma once
#include <string>
using namespace std;
namespace inputData{
void InputInfo(string** arr, int i);
}
namespace calculatingData {
float get_avg(string** arr, int num);
int get_early_birth(string** arr, int num);
}
- myFunc.cpp
#include <iostream>
#include <string>
#include <vector>
#include "MyFunc.h"
using namespace std;
#define INFO_COLUMN 3
#define NAME_IDX 0
#define AGE_IDX 1
#define BIRTH_IDX 2
namespace inputData
{
void InputInfo(string** arr, int i) {
// 0 1 2 3 4 5 6 7 8 9 10 11 12
// 강예정 2 5 0 0 1 1 3 0
bool error;
int ok = 0;
int name_split_point;
int age_split_point;
string input;
string name;
string age;
string birth;
while (ok == 0) {
bool error = false; // 중간에 한번 에러 메세지 떴어도 마지막에 ok 받고 나갈 수 있도록 error 변수 초기화
getline(cin, input);
// 이름 추출
name_split_point = input.find(" ");
name = input.substr(0, name_split_point);
// 이름에 숫자가 있는지 확인(문자면 0, 그런데 특수문자도 0이 되는건 어떻게 해결합니까 ???)
// 이름의 길이는 상관없음.
for (char c : name) {
if (isdigit(c) != 0) {
cout << "***입력 오류: 이름은 문자로만 입력하시오.***" << endl;
error = true;
break;
}
}
// 나이 추출
age_split_point = input.find(" ", name_split_point + 1);
age = input.substr((name_split_point + 1), (age_split_point - name_split_point - 1));
// 나이가 숫자로 이루어져있는지 확인
// 나이의 길이는 상관없음.
for (char c : age) {
if (isdigit(c) == 0) {
cout << "***입력 오류: 나이는 숫자로만 입력하시오.***" << endl;
error = true;
break;
}
}
// 생일 추출
birth = input.substr(age_split_point + 1);
// 나이의 길이가 여섯자리인지 확인
if (birth.length() != 6) {
cout << "***입력 오류: 생일은 여섯 자리만 입력하시오.***" << endl;
error = true;
}
// 나이가 숫자로 이루어져있는지 확인
for (char c : birth) {
if (isdigit(c) == 0) {
cout << "***입력 오류: 생일은 숫자로만 입력하시오.***" << endl;
error = true;
break;
}
}
if (error == false) {
arr[i][NAME_IDX] = name;
arr[i][AGE_IDX] = age;
arr[i][BIRTH_IDX] = birth;
ok++;
}
}
}
}
namespace calculatingData {
float get_avg(string** arr, int num) {
float sum = 0;
for (int i = 1; i < num + 1; i++) {
sum += stof(arr[i][AGE_IDX]);
} return (sum / num);
}
int get_early_birth(string** arr, int num) {
int min = 10000;
for (int i = 1; i < num + 1; i++) {
int birth_md = stoi(arr[i][BIRTH_IDX].substr(2, 5));
if (birth_md <= min) {
min = birth_md;
}
}
return min;
}
}
- MainFileSeparation
#include <iostream>
#include <string>
#include "MyFunc.h"
using namespace std;
using namespace calculatingData;
using namespace inputData;
#define INFO_COLUMN 3
#define NAME_IDX 0
#define AGE_IDX 1
#define BIRTH_IDX 2
int main() {
int stnum;
string early_birth;
cout << "입력할 학생의 수 : ";
cin >> stnum;
cout << endl;
cin.ignore();
// 동적 배열 선언
string** st_matrix = new string * [stnum + 1];
for (int i = 0; i < stnum + 1; i++) {
st_matrix[i] = new string[INFO_COLUMN];
}
// 배열 상단에 정보의 종류 할당
st_matrix[0][NAME_IDX] = "이름";
st_matrix[0][AGE_IDX] = "나이";
st_matrix[0][BIRTH_IDX] = "생년월일";
// 2) 학생 정보 입력받은 뒤 배열에 저장하는 함수 호출
cout << stnum << " 명의 학생의 이름, 나이, 생년월일을 순서대로 입력하시오. (ex: 리더님 20 050101)" << endl << endl;
for (int i = 1; i < stnum + 1; i++) {
InputInfo(st_matrix, i);
}
// 3 - 1) 학생 정보 출력
for (int i = 0; i < stnum + 1; i++) {
cout << endl;
for (int j = 0; j < INFO_COLUMN; j++) {
cout << st_matrix[i][j] << "\t";
}
}
cout << endl << endl;
// 3 - 2) 평균 나이 출력
cout << "학생의 평균 나이는 : " << get_avg(st_matrix, stnum) << endl << endl;
// 3 - 3) 가장 빠른 생일 출력
early_birth = to_string(get_early_birth(st_matrix, stnum));
cout << "가장 빠른 생일은 : " << early_birth.substr(0, 2) << " / " << early_birth.substr(2, 2) << endl << endl;
// 3 - 4) 배열 해제 후 프로그램 종료
for (int i = 0; i < stnum + 1; i++) {
delete[] st_matrix[i];
}
delete[] st_matrix;
return 0;
}
- 파일 입출력
fstream의 종류
1) ifstream
2) ofstream
- ifstream
파일의 내용을 가지고 와서 프로그램에 입력할 수 있게 도와주는 클래스
ifstream read_file; // 파일을 담을 변수 선언
read _file.open("test_file.txt"); // test_file.txt이라는 파일 열기
ifstream read_file("test_file.txt"); // 파일을 담을 변수 선언과 동시에 파일 열기
ifstream file("test_file.txt");
string str;
file >> str; // 띄어쓰기 전까지 읽어서 str에 저장
string line;
getline(file, line); // 엔터 전까지 읽어서 line에 저장
- ofstream
프로그램의 출력을 파일에 저장할 수 있게 돕는 클래스
ofstream write_file;
write_file.open("test_file2.txt");
ofstream write_file("test_file2.txt");
ofstream write_file("test_file2.txt");
if (write_file.fail()) cout << "파일 없음" << endl;
// 보통 쓰기권한에서는 파일이 없을 경우 자동으로 생성됨.
// 만약 자동으로 생성되지 않았을 경우 fail()이 true가 나올 예정
write_file << "hello world!"; // hello world라는 글자를 test_file2.txt에 작성
'Smart Factory Bootcamp' 카테고리의 다른 글
[C++] thread (0) | 2024.06.27 |
---|---|
[C++ 입문] 7. structure, class (0) | 2024.05.14 |
[C++ 입문] 5. list, string (0) | 2024.04.30 |
[C++ 입문] 4. vector, execution time (0) | 2024.04.26 |
[C++ 입문] 3. pointer, dynamic array (0) | 2024.04.26 |