4-3 File IO - 시스템 함수 (과제-2)

5377 단어 APIAPI

설명.

  1. 2-3 수강신청 정보를 파일에 저장하기. (파일 저장이기 때문에 프로그램 재기동 되어도 수강신청 정보는 유지됨)
  2. 입력 가능한 수강신청 정보 최대 수는 50개
  3. 입력 메뉴
  • 아이디 정수 범위는 1<=ID<=1000
    다른 사용자가 사용하는 ID를 입력하거나, 범위를 벗어나 ID 입력하면 - 에러 메세지 출력 후 다시 메뉴 출력
  • 이름은 한글 최대 4자
  • 과목명은 2-3 과제와 동일한 형태로 입력받음
    • 수강 신청할 과목명만 콤마로 구분하여 입력함
    • 콤마는 과목명 사이의 공백 문자가 몇개있든 무시하고 과목명만 입력이 되어야함
    • 존재하지 않는 과목명 입력시 에러 메세지 출력 후 메뉴 출력
  1. 출력 메뉴
  • 수강 신청자 이름 (한글 최대 4자 입력받기)의 정보만 출력함
  • 이름이 동일하면, 동일한 이름의 모든 사람 정보 출력
  • all을 입력받으면, 모든 사람 정보 출력
  1. 출력 정보
  • ID, 이름, 과목명이 한줄에 출력되어야함
  • ID값은 4자리 고정출력으로 4자리 이하 숫자는 왼쪽에 공백으로 채워짐
  • 이름은 한글기준4자리(영문기준8자리) 고정출력으로 4자리 이하 한글에 대해서는 오른쪽에 공백으로 채워짐

출력예제.

이름: 김민
ID:   1, 이름:김민    , 수강신청 과목: 컴퓨터개론, C언어, 자료구조, 네트워크개론
이름: all
ID:   1, 이름:김민    , 수강신청 과목: 컴퓨터개론, C언어, 자료구조, 네트워크개론
ID:  10, 이름:홍길동  , 수강신청 과목: 컴퓨터개론, C언어

코드.

진행 사항
1. 버퍼 메모리 관리
2. 권한 0644
3. write - 양식 "id (정수는 char로 변환) name sub" 으로 개행 넣어서 하나씩 받기

id 범위
이름 자르기

과목 공백처리+콤마구분+strcmp+끝에 널처리 확인해야함
4. read - 이름 검색은 어떻게 할지 ?.?
fgets readfile

복붙 비쥬얼블록 =

#include <stdio.h>
#include <errno.h> //errno
#include <string.h> //strerror() strlen()
#include <fcntl.h> //open()
#include <unistd.h> //read() write() close()
#include <stdio_ext.h> //__fpurge

enum { Max_Info = 3, Max_Sub = 8 }; //Max=50

typedef struct Info {
int id;
char name[13]; //1글자 3byte
char sub[200];
} Info;

const char* Subject[Max_Sub] =
{ "컴퓨터개론", "이산수학", "C언어", "JAVA초급",
"리눅스구조", "자료구조", "컴파일러", "네트워크개론" };

int Enter(int* n)
{
const char enter[1] = "\n";
if (write(*n, enter, sizeof(enter)) < 1) {
fprintf(stderr, "WRITE SPACE errno[%d] : %s\n", errno, strerror(errno));
return 0;
}

return 1;
}

int main()
{
int fd = 0;
const char* path = "./c.txt";

fd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644);
if (fd == -1) {
fprintf(stderr, "OPEN errno[%d] : %s\n", errno, strerror(errno));
if (errno == EEXIST) {
printf("이미 존재하는 파일입니다.\n");
return 0;
}
else {
return 0;
}
}

Info info[Max_Info];

int i = 0;
int select = 0;
char id_s[5];

do {
printf("======================\n");
printf("1. 수강 신청 정보 입력\n");
printf("2. 수강 신청 정보 출력\n");
printf("3. 종료\n");
printf("======================\n");
printf("select num: ");
scanf("%d", &select);
while (getchar() != '\n') {};

if (select != 1 && select != 2 && select != 3) {
printf("숫자를 다시 입력해주세요.\n");
}

switch (select) {
case 1:
{
printf("ID: ");
scanf("%d", &info[i].id);
if ((info[i].id < 1) || (info[i].id) > 1000) {
printf("아이디의 범위는 1부터 1000입니다.\n");
break;
}
while (getchar() != '\n') {};
snprintf(id_s, sizeof(id_s), "%d", info[i].id);
printf("ID 숫자의 자릿수: %ld개\n", strlen(id_s));
id_s[strlen(id_s) + 1] = '\0';
if (write(fd, id_s, sizeof(id_s)) < 1) {
fprintf(stderr, "WRITE ID errno[%d] : %s\n", errno, strerror(errno));
return 0;
}
if (Enter(&fd) == 0) {
return 0;
}

printf("이름: ");
scanf("%s", info[i].name);
while (getchar() != '\n') {};
info[i].name[sizeof(info[i].name) - 1] = '\0'; //[0]~[11]까지 한글. [12]개행
if (write(fd, info[i].name, sizeof(info[i].name)) < 1) {
fprintf(stderr, "WRITE NAME errno[%d] : %s\n", errno, strerror(errno));
return 0;
}
if (Enter(&fd) == 0) {
return 0;
}

int k = 0;
memset(info[i].sub, 0, sizeof(info[i].sub));
printf("수강 신청 과목: ");
if (fgets(info[i].sub, sizeof(info[i].sub), stdin) != NULL) {
if (info[i].sub[sizeof(info[i].sub) - 1] == '\n') {
info[i].sub[sizeof(info[i].sub) - 1] = '\0';
}
__fpurge(stdin);
}

for (size_t j = 0; j < sizeof(info[i].sub) - 1; j++) {
if (info[i].sub[j] != ' ') {
info[i].sub[k] = info[i].sub[j];
k++;
}
}
info[i].sub[k] = '\0';

if (write(fd, info[i].sub, sizeof(info[i].sub)) < 1) {
fprintf(stderr, "WRITE SUB errno[%d] : %s\n", errno, strerror(errno));
return 0;
}
                    
i++;
}
break;
case 2:
{
//read()
}
break;
case 3:
{
if (close(fd) == -1) {
fprintf(stderr, "CLOSE errno[%d] : %s\n", errno, strerror(errno));
if (errno == EBADF) {
return 0;
}
else {
return 0;
}
}
}
break;
}
} while (select != 3);

return 0;
}

현재 진행사항 확인용

좋은 웹페이지 즐겨찾기