리눅스
아직 과제 argc=2인 경우만 구현
정지홍
2023. 3. 25. 23:23
//기본 경우 수
//-n은 이름, -y는 연도 , -a는 연봉
/*show -n hong*/ //이름만 입력시 매년 정보 출력
/*show -n hong -y 2021*/ //이름 및 연도만 입력시 해당연도 연봉
/*show -a*/ //전 직원 평균 연봉
/*show -a -y 2021*/ //해당연도 평균 연봉
//2020y ~ 2024y
//나중에 추가해볼것
//-b 부서 , -g 근문 평점, -e입사년도
//argc가 2인 경우:->./show -a
//argc가 3인 경우:->./show -n Hong
//argc가 4인 경우:->./show -a -y 2021
//argc가 5인 경우:->./show -n Hong -y 2021
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){
int fd1,fd2,fd3,fd4,fd5;//파일 기술자 각각 txt1부터 txt5까지.
int n;//스업예제로 테스트 나중에 지우기
char buf[512];
//char *inform[]={"-n", "-y", "-a", "-b", "-g", "-e", '\0'};
//차례대로 텍스트파일을 읽기 전용으로 열어줍니다.
fd1=open("data1.txt",O_RDONLY);
if (fd1==-1){
perror("data1.txt");
exit(1);
}
fd2=open("data2.txt",O_RDONLY);
if (fd2==-1){
perror("data2.txt");
exit(1);
}
fd3=open("data3.txt",O_RDONLY);
if (fd3==-1){
perror("data3.txt");
exit(1);
}
fd4=open("data4.txt",O_RDONLY);
if (fd4==-1){
perror("data4.txt");
exit(1);
}
fd5=open("data5.txt",O_RDONLY);
if (fd5==-1){
perror("data1.txt");
exit(1);
}
extern char *oparg;
extern int optind;
//printf("Current Optind : %d\n",optind);
if(argc==2){
while( (n=getopt(argc,argv,"a"))!=-1){
switch(n){
case 'a'://매년 모든 직원의 연봉을 출력합니다.(./show -a)
int x;//read함수에서 사용할 변수입니다. 리드함수는 실행마다 읽어온 크기만큼 오프셋이 이동합니다.
int cnt=1;//텍스트 파일에 처음 숫자는 입사한 연도이니 이것을 구별하기 위한 변수입니다.
int rst=0;//각각 자릿수마다 더 해질 변수입니다.
int sum=0;//사원들의 연봉 합을 저장하는 변수입니다.
int bunmo=0;//사원수를 카운트하는 변수입니다.
float avg;//연봉 평균을 저장할 변수입니다.
/*----------------------2020년도 전 직원의 평균 연봉 출력-----------------------*/
while((x=read(fd1,buf,1))>0){//2020년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
sum+=rst;//사원의 연봉을 총합에 더해줍니다.
rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
bunmo+=1;//사원수를 1명 더해줍니다.
cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
}
}
if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
rst=save;//rst에 저장해줍니다.
cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
}
else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
rst+=save;//뒤에 숫자를 더해줍니다.
cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
}
}
else{//입사년도에 해당되는 케이스입니다.
cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
}
}
}
avg=sum/bunmo;//평균 연봉을 구합니다.
printf("2020년 직원의 평균 연봉은 %.2f입니다.\n",avg);
/*----------------------2021년도 전 직원의 평균 연봉 출력-----------------------*/
cnt=1;
rst=0;
sum=0;
bunmo=0;
while((x=read(fd2,buf,1))>0){//2021년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
sum+=rst;//사원의 연봉을 총합에 더해줍니다.
rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
bunmo+=1;//사원수를 1명 더해줍니다.
cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
}
}
if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
rst=save;//rst에 저장해줍니다.
cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
}
else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
rst+=save;//뒤에 숫자를 더해줍니다.
cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
}
}
else{//입사년도에 해당되는 케이스입니다.
cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
}
}
}
avg=sum/bunmo;//평균 연봉을 구합니다.
printf("2021년 직원의 평균 연봉은 %.2f입니다.\n",avg);
/*----------------------2022년도 전 직원의 평균 연봉 출력-----------------------*/
cnt=1;
rst=0;
sum=0;
bunmo=0;
while((x=read(fd3,buf,1))>0){//2022년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
sum+=rst;//사원의 연봉을 총합에 더해줍니다.
rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
bunmo+=1;//사원수를 1명 더해줍니다.
cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
}
}
if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
rst=save;//rst에 저장해줍니다.
cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
}
else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
rst+=save;//뒤에 숫자를 더해줍니다.
cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
}
}
else{//입사년도에 해당되는 케이스입니다.
cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
}
}
}
avg=sum/bunmo;//평균 연봉을 구합니다.
printf("2022년 직원의 평균 연봉은 %.2f입니다.\n",avg);
/*----------------------2023년도 전 직원의 평균 연봉 출력-----------------------*/
cnt=1;
rst=0;
sum=0;
bunmo=0;
while((x=read(fd4,buf,1))>0){//2023년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
sum+=rst;//사원의 연봉을 총합에 더해줍니다.
rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
bunmo+=1;//사원수를 1명 더해줍니다.
cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
}
}
if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
rst=save;//rst에 저장해줍니다.
cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
}
else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
rst+=save;//뒤에 숫자를 더해줍니다.
cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
}
}
else{//입사년도에 해당되는 케이스입니다.
cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
}
}
}
avg=sum/bunmo;//평균 연봉을 구합니다.
printf("2023년 직원의 평균 연봉은 %.2f입니다.\n",avg);
/*----------------------2024년도 전 직원의 평균 연봉 출력-----------------------*/
cnt=1;
rst=0;
sum=0;
bunmo=0;
while((x=read(fd5,buf,1))>0){//2024년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
sum+=rst;//사원의 연봉을 총합에 더해줍니다.
rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
bunmo+=1;//사원수를 1명 더해줍니다.
cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
}
}
if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
rst=save;//rst에 저장해줍니다.
cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
}
else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
rst+=save;//뒤에 숫자를 더해줍니다.
cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
}
}
else{//입사년도에 해당되는 케이스입니다.
cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
}
}
}
avg=sum/bunmo;//평균 연봉을 구합니다.
printf("2024년 직원의 평균 연봉은 %.2f입니다.\n",avg);
break;
}
}
}
if(argc==3){
while( (n=getopt(argc,argv,"n:y:a:"))!=-1){
switch(n){
case 'n':
printf("Option : n , Argment=%s\n",optarg);
break;
case 'y':
printf("Option : y , Argment=%s\n",optarg);
break;
case 'a':
printf("Option : a , Argment=%s\n",optarg);
break;
}
printf("next optind: %d\n",optind);
}
}
if(argc==4){
while( (n=getopt(argc,argv,"n:y:a:"))!=-1){
switch(n){
case 'n':
printf("Option : n , Argment=%s\n",optarg);
break;
case 'y':
printf("Option : y , Argment=%s\n",optarg);
break;
case 'a':
printf("Option : a , Argment=%s\n",optarg);
break;
}
printf("next optind: %d\n",optind);
}
}
return 0;
//파일을 닫아줍니다.
close(fd1);
close(fd2);
close(fd3);
close(fd4);
close(fd5);
return 0;
}