'strtok'에 해당되는 글 1건



1. 목적

  - 파일을 받아 자료를 처리해서 출력 한다.
  - 자료는 구조체를 써서 저장한다.

2. 문제
  - no_08.txt 파일을 읽어 입력받은 값과 평균을 출력한다.
  - no_08.txt 파일은 아래와 같다.

필드 : 이름/학번/국어/영어/수학/과학

레코드
홍길동 2003010501 95 87 65 98
백두산 2003010502 88 59 74 93
한라산 2003010503 58 70 92 89
이강산 2003010505 73 66 91 99

  - 평균값을 출력하는 필드를 추가하여 화면에 같이 출력한다.
  - 출력예

학번             이름    국어    영어    수학    과학    평균
2003010501       홍길동  95      87      65      98      86.3
2003010502       백두산  88      59      74      93      78.5
2003010503       한라산  58      70      92      89      77.3
2003010505       이강산  73      66      91      99      82.3
Press any key to continue

3. 이해
  - 데이터 구조를 이해하고 이를 구조체로 구현 있는가?
  - 파일을 받아 자료로 적소에 저장할수 있는가?
  - 자료처리하는 기초적인 능력이 있는가?

4. 코드

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
 
struct data
 {
  long id;
  char name[8];
  int kor;
  int eng;
  int math;
  int sci;
 
  float ave;

 }stu[4];

 FILE *fp = NULL;
 int i = 0;
 char instr[255];

 fp = fopen("no_08.txt","r");

 while(fgets(instr,255,fp))
 {
  strcpy(stu[i].name,strtok(instr," "));
  stu[i].id = atoi(strtok(NULL," "));
  stu[i].kor = atoi(strtok(NULL," "));
  stu[i].eng = atoi(strtok(NULL," "));
  stu[i].math = atoi(strtok(NULL," "));
  stu[i].sci = atoi(strtok(NULL," "));
  stu[i].ave = (float)(stu[i].kor + stu[i].eng + stu[i].math + stu[i].sci) / 4;

  i++;


 }
 
 i = 0;

 printf("학번\t\t 이름\t 국어\t 영어\t 수학\t 과학\t 평균\n");

 while(i<4)
 {
  printf("%d\t %s\t %d\t %d\t %d\t %d\t %0.01f\n",stu[i].id, stu[i].name, stu[i].kor, stu[i].eng, stu[i].math, stu[i].sci, stu[i].ave);
  i++;
 }

 fclose(fp);

 return 0;
}

5. 해설
  - 파일을 읽고 해당 줄을 끊어서 구조체로 정의된 구조에 저정 시킨후 자료 처리 및 출력하는
    내용입니다.
  - strtok 함수는 해당 문장을 특정 문자로 끊어 출력하게 만드는 역할을 합니다.
  - 학번은 숫자 길이가 길기 때문에 int 로 하면 문제가 생깁니다. char 로 하던지 long 형으로 만듭니다.
  - struct 문장은 구조체 선언부입니다.
  - %0.01f 는 자릿수를 소숫점 아래 첫째자리 까지 반올림 하라는 뜻입니다.
  - (float)는 int 형으로 받은 자료를 float 로 변환하는 캐스팅 문장입니다. 하지 않으면 나눗셈에서 소숫
     점 자리 손실 경고가 나옵니다.
  - atoi 함수는 stdlib.h 에서 정의된 문자열을 숫자로 바꾸는 함수입니다.
  - strtok는 NULL 을 인수로 하면 이전에 썼던 문자열을 다시 씁니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/12-1-4.htm :   strtok 함수
  - http://www.winapi.co.kr/clec/cpp1/13-1-1.htm : 구조체
  - atoi(strtok(NULL, " ")); - 토큰 끊기 구문
 

Posted by 카켈
이전페이지 1 다음페이지