프로그래밍

 3198, 1/160 회원가입  로그인  
   jj4st13
   파일입출력 질문....

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


파일에 아무 내용이 없을때 리턴을 하게 했지만 다음 코드로 넘어갑니다...

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

int read_score();
char set_grade(int score, int grade_count[]);
char grade;
int main()
{
int total = 0, count = 0, i;
int grade_count[5] = {0,0,0,0,0};
int score;
FILE *fp;
fp = fopen("text.txt","r");
printf("점수출력(-1은 점수입력 끝) \n\n");

while(1)
{
score = read_score(fp);//입력할 성적 부르는 함수
printf("%d\n",score);//해당 점수 출력
if(score == -1)
break;

else
{
//입력한 성적에 해당하는 학점을 배열에 추가하는 함수
set_grade(score, grade_count);

total+=score;
count++;
}
}

fclose(fp);

if(count==0)
printf("입력이 없습니다.\n");

else
{
printf("입력하신 점수의 총합은 %d 입니다.\n",total);
printf("입력하신 점수의 평균은 %d 입니다.\n\n",total/count);
printf("A B C D F\n");
for(i = 0; i < 5; ++i)
printf("%d ", grade_count[i]);

printf("\n");
}

return 0;
}


int read_score(FILE *fp)
{  
int score;

if(fp == NULL)//파일에 점수가 없거나
return -1;//파일입력이 끝나면 -1 반환

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

printf("%c\n\n",grade);//학점출력
return score;
}


//각score에 대한 점수를 배열에 저장
char set_grade(int score, int grade_count[])
{

switch (score / 10){
case 10:
grade = 'A';
grade_count[0]++;
break;
case 9:
grade = 'A';
grade_count[0]++;
break;
case 8:
grade = 'B';
grade_count[1]++;
break;
case 7:
grade = 'C';
grade_count[2]++;
break;
case 6:
grade = 'D';
grade_count[3]++;
break;
default:
grade = 'F';
grade_count[4]++;
break;
}
return grade;

}

리드함수에서 포인터를 받아서.....만약 파일에 아무것도 없으면 return -1을 해야하는데...바로 fscanf로 가는듯 합니다....
아무런 이상이 없어보이는데 왜 그런거죠?


또 질문 한가지...파일을 오픈하는데..만약 그 파일이 존재하지 않는다면 파일이 존재하지 않는다고 출력하려면
어떻게 해야하나요
if(fp==NULL) ----- 이건 파일에 아무런 내용이 없을 경우잔아요... 어떻게 해야할지..

  Hit : 4217     Date : 2011/12/04 04:16



    
prosthetics /*
fscanf에서 f1키를 누르면 도움말이 나옵니다.
http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=KO-KR&k=k(%22STDIO%2fFSCANF%22);k(FSCANF);k(DevLang-%22C%2B%2B%22);k(TargetOS-WINDOWS)&rd=true
If an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for fscanf and fwscanf.
fscanf는 파일의 끝을 만나면 EOF를 반환합니다.

fp==null이 아닙니다.
아래처럼 바꿔주셔야 합니다.
if(fscanf(fp,"%d",&score)==EOF);//
return -1;//

fp는 항상 파일의 시작주소를 가지고 있습니다.
fopen을 통해 메모리에 올라온 주소 말입니다.
fscnf, fprintf같은 함수를 사용해도 fp값은 한결같이 파일의 시작주소를 가리킵니다.

파일의 위치를 가리키는것은 따로있습니다.
fscanf나 fprintf같이 파일에 읽기, 쓰기 명령을 내리면 자동으로 다음 단어로 넘가야 합니다.
예를 들어 "10 20 30"가 파일에 저장되어있는데
fscanf(fp,"%d",&score);와 같은 명령을 사용했다면 score에 10이 들어가야 겠지요.
그 다음에 위 명령을 다시 한번 실행하면 score에는 20이 들어가야 합니다.
이렇게 자동으로 다음 위치를 기억하는 것을 offset이라고 부릅니다.
offset은 파일 읽기, 쓰기와 같은 명령을 내리면 자동으로 증가합니다.
이것을 조절하기 위해 fseek()라는 함수가 있습니다. (www.winapi.co.kr ->C/C++레퍼런스)

값이 지정안된 grade전역변수에 접근하는 논리적 오류도 보이는데
아직 프로그램 완성 안하신것 같으니까 알아서 고치실거라 믿습니다.
*/
#include <stdio.h>
#include <string.h>

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

printf("점수출력(-1은 점수입력 끝) \n\n");

while(1)
{
score = read_score(fp);//입력할 성적 부르는 함수
printf("%d\n",score);//해당 점수 출력
if(score == -1)
break;

else
{
//입력한 성적에 해당하는 학점을 배열에 추가하는 함수
set_grade(score, grade_count);

total+=score;
count++;
}
}

fclose(fp);

if(count==0)
printf("입력이 없습니다.\n");

else
{
printf("입력하신 점수의 총합은 %d 입니다.\n",total);
printf("입력하신 점수의 평균은 %d 입니다.\n\n",total/count);
printf("A B C D F\n");
for(i = 0; i < 5; ++i)
printf("%d ", grade_count[i]);

printf("\n");
}

return 0;
}


int read_score(FILE *fp)
{
int score;

if(fscanf(fp,"%d",&score)==EOF);//
return -1;//
//if(fp == NULL)//파일에 점수가 없거나
// return -1;//파일입력이 끝나면 -1 반환

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

printf("%c\n\n",grade);//학점출력

return score;
}


//각score에 대한 점수를 배열에 저장
char set_grade(int score, int grade_count[])
{

switch (score / 10){
case 10:
grade = 'A';
grade_count[0]++;
break;
case 9:
grade = 'A';
grade_count[0]++;
break;
case 8:
grade = 'B';
grade_count[1]++;
break;
case 7:
grade = 'C';
grade_count[2]++;
break;
case 6:
grade = 'D';
grade_count[3]++;
break;
default:
grade = 'F';
grade_count[4]++;
break;
}
return grade;

}
2011/12/04