4-3 File IO - 시스템 함수 (과제-2)
설명.
2-3 수강신청 정보를 파일에 저장하기. (파일 저장이기 때문에 프로그램 재기동 되어도 수강신청 정보는 유지됨)입력 가능한 수강신청 정보 최대 수는 50개- 입력 메뉴
아이디 정수 범위는 1<=ID<=1000
다른 사용자가 사용하는 ID를 입력하거나, 범위를 벗어나 ID 입력하면 - 에러 메세지 출력 후 다시 메뉴 출력이름은 한글 최대 4자- 과목명은 2-3 과제와 동일한 형태로 입력받음
- 수강 신청할 과목명만 콤마로 구분하여 입력함
콤마는 과목명 사이의 공백 문자가 몇개있든 무시하고 과목명만 입력이 되어야함- 존재하지 않는 과목명 입력시 에러 메세지 출력 후 메뉴 출력
- 출력 메뉴
- 수강 신청자 이름 (한글 최대 4자 입력받기)의 정보만 출력함
- 이름이 동일하면, 동일한 이름의 모든 사람 정보 출력
- all을 입력받으면, 모든 사람 정보 출력
- 출력 정보
- 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;
}
현재 진행사항 확인용
Author And Source
이 문제에 관하여(4-3 File IO - 시스템 함수 (과제-2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@doheeklm/4-3-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)