프로그래밍

 3198, 1/160 회원가입  로그인  
   jj4st13
   아까 밑에 한 질문에서 숫자를 받아오는거 질문입니다..

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3231 [복사]


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

int read_score();
char set_grade();

int main()
{
        int total = 0, score=0, count = 0;
        int grade_count[5]={0};
        float average;
        char grade;
        FILE *fp=fopen("text.txt","r");

        if(fp == NULL){
                printf("파일이 없습니다\n");
                return -1;
        }

        for (;;)
        {
                score=read_score(fp);
                printf("\n");

                if(score==-1)
                        break;

                else
                {
                        grade=set_grade(score,grade_count);

                        total += score;
                        count++;
                        printf("점수: %d\t학점:%c\n\n",score,grade);

                }
        }

        if (count == 0 )
                printf("입력 없음\n");


        else
        {
                average = (float) total / count;
                printf("총점: %d\n", total);
                printf("평균: %5.2f\n", average);
                printf("A개수:%d  B개수:%d  C개수:%d  D개수:%d  F개수:%d ",grade_count[0],grade_count[1],grade_count[2],grade_count[3],grade_count[4]);
        }
        system("pause");
        return 0;
}

int read_score(FILE *fp)
{    
        int score;

        if(fscanf(fp,"%d",&score)==EOF)
                return -1;

        printf("점수 입력 (0 to 100/-1은 끝): ");

        fscanf(fp,"%d",&score);

        while(score>100||score<-1)
        {
                fscanf(fp,"%d",&score);
        }

        return score;

}

char set_grade(int score, int grate_count[])
{
        int fake;
        fake=score/10;

        if(fake==10)
        {
                grate_count[0]+=1;
                return 'A';
        }
        else if(fake==9)
        {
                grate_count[1]+=1;
                return 'B';
        }
        else if(fake==8)
        {
                grate_count[2]+=1;
                return 'C';
        }
        else if(fake==7)
        {
                grate_count[3]+=1;
                return 'D';
        }
        else
        {
                grate_count[4]+=1;
                return 'F';
        }
}

아까 질문한 코드인데 오류나는부분을 다 고쳤습니다...그런데 질문입니다...
리드함수를 바꾸고 싶습니다...

이렇게 바꿔봣습니다..

int read_score(FILE *fp)
{    
        int score;

        if(fscanf(fp,"%d",&score)==EOF)
                return -1;

        printf("점수 입력 (0 to 100/-1은 끝): ");

        while(1)
        {
                fscanf(fp,"%d",&score);
                if(-1<=score&&score<=100)
                        return score;
        }
}

그런데..이렇게 하니 어째 다 입력받질 못하더라구요.....
text.txt에 100 90 80 70 60 -1 을 저장했습니다.

그러면 다 입력받고  매인함수에서 -1이 반환됬을때 저 루프에서 탈출해야하는데.....
출력해보니...다입력받지 못하고
90 70 이거 2개만 입력받고 끝나더군요....
도데체 머가 문제일가요?


  Hit : 3953     Date : 2011/12/05 12:13



    
prosthetics /*
지난번 질문에서 offset에 대해 설명해 드렸는데
fscanf, fprintf를 쓰면 offset이 자동으로 증가해서 다음 문자를 가리킨다고 했습니다.

jj4st13님은
if(fscanf(fp,"%d",&score)==EOF) //여기서 한번
fscanf(fp,"%d",&score);//여기서 한번
즉, 2번 offset을 변경합니다.

첫번째에서 100을 score에 저장하고 offset을 90이 저장된 주소로 옴기고
두번째에서 90을 score에 저장하고 함수를 끝냅니다.
마찬가지로 한번 더 함수를 호출하고 나면

read_score()함수에서 반환하는 값은 90과 70, -1뿐입니다.
(무한루프 돌뻔했는데 조건문이 맞아서 -1은 반환하네요.)

어쨋든 알아서 고치셈
*/
2011/12/05  
jj4st13 ㅎㅎ 감사합니다....처음 if문때문에 offset가 변경되니
이걸 fseek로 맨처음으로 되돌리면 되는거군요 감사합니다...
메인문에 넣으니 아무런 이상없이 잘 되네요
2011/12/05  
prosthetics /*
이렇게 바꾸면 되는데..
어쨋든 fseek를 쓰셔서 되셨다니 축하드립니다.
*/
int read_score(FILE *fp)
{
int score;
printf("점수 입력 (0 to 100/-1은 끝): ");

while(1)
{
if(fscanf(fp,"%d",&score)==EOF)
return -1;
if(-1<=score&&score<=100)
return score;
}
}
2011/12/05