2013-04-09 4 views
-1

파일 (개행 문자로 구분 된 숫자 포함)을 읽고 금액을 계산 중입니다. 문제는 파일을 읽고 첫 번째 문자의 첫 글자를 건너 뛰는 배열에 금액을 저장하는 것입니다. 예를 들어 첫 번째 행의 값이 324라면 24가되고 행의 값이 3이면 정크가됩니다. vale하지만 라인의 나머지는 괜찮습니다.파일의 첫 번째 행을 읽는 중 작동하지 않습니다.

코드는 첫번째 문자가 getc 기능에 의해 소비되는

#include<graphics.h> 
#include<conio.h> 
#include<stdio.h> 
#include<stdlib.h> 
static int den[9]={1000,500,100,50,20,10,5,2,1}; 
void main() 
{ 
clrscr(); 
unsigned long long amt[9]; 
unsigned long long temp=0,total=0; 
int c=0,i=0,j=0,gd=DETECT,gm,x=66,y=22,font=8; 
fflush(stdin); 
FILE *fp; 
fp=fopen("OPENCASH.TXT","r"); 
while((c=getc(fp))!=EOF) 
{ 
    fscanf(fp,"%llu",&amt[i]); 
    i++; 
} 
initgraph(&gd,&gm,"C:\\TC\\BGI"); 
settextstyle(font,HORIZ_DIR,1); 
printf(" \t  "); 
for (i=0;j<50;j++) 
{ 
    printf("_"); 
} 
outtextxy(x, y, " The Closing Cash Denomination"); 
printf("\n\n\n\t "); 
for (i=0;i<50;i++) 
{ 
    printf("_"); 
} 
font=5; 
settextstyle(font,HORIZ_DIR,1); 
x=30; 
y=87; 
outtextxy(x,y,"1000"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,7); 
printf("%llu",amt[0]); 
outtextxy(205,--y,"="); 
temp=den[0]*amt[0]; 
total=total+temp; 
gotoxy(35,7); 
printf("%llu",temp); 
++y; 
font=5; 
x=42; 
y=y+34; 
outtextxy(x,y,"500"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,9); 
printf("%llu",amt[1]); 
outtextxy(205,--y,"="); 
temp=den[1]*amt[1]; 
total=total+temp; 
gotoxy(35,9); 
printf("%llu",temp); 
++y; 
font=5; 
y=y+32; 
outtextxy(x,y,"100"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,11); 
printf("%llu",amt[2]); 
outtextxy(205,--y,"="); 
temp=den[2]*amt[2]; 
total=total+temp; 
gotoxy(35,11); 
printf("%llu",temp); 
++y; 
font=5; 
x=54; 
y=y+31; 
outtextxy(x,y,"50"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,13); 
printf("%llu",amt[3]); 
outtextxy(205,--y,"="); 
temp=den[3]*amt[3]; 
total=total+temp; 
gotoxy(35,13); 
printf("%llu",temp); 
++y; 
font=5; 
y=y+31; 
outtextxy(x,y,"20"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,15); 
printf("%llu",amt[4]); 
outtextxy(205,--y,"="); 
temp=den[4]*amt[4]; 
total=total+temp; 
gotoxy(35,15); 
printf("%llu",temp); 
++y; 
font=5; 
y=y+34; 
outtextxy(x,y,"10"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,17); 
printf("%llu",amt[5]); 
outtextxy(205,--y,"="); 
temp=den[5]*amt[5]; 
total=total+temp; 
gotoxy(35,17); 
printf("%llu",temp); 
++y; 
font=5; 
x=64; 
y=y+32; 
outtextxy(x,y,"5"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,19); 
printf("%llu",amt[6]); 
outtextxy(205,--y,"="); 
temp=den[6]*amt[6]; 
total=total+temp; 
gotoxy(35,19); 
printf("%llu",temp); 
++y; 
font=5; 
y=y+31; 
outtextxy(x,y,"2"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,21); 
printf("%llu",amt[7]); 
outtextxy(205,--y,"="); 
temp=den[7]*amt[7]; 
total=total+temp; 
gotoxy(35,21); 
printf("%llu",temp); 
++y; 
font=5; 
y=y+31; 
outtextxy(x,y,"1"); 
font=6; 
settextstyle(font,HORIZ_DIR,1); 
outtextxy(104,y,"X"); 
gotoxy(20,23); 
printf("%llu",amt[8]); 
outtextxy(205,--y,"="); 
temp=den[8]*amt[8]; 
total=total+temp; 
gotoxy(35,23); 
printf("%llu",temp); 
y=y+9; 
outtextxy(264,y,"___________"); 
y=y+27; 
outtextxy(150,y,"Total Cash"); 
gotoxy(35,25); 
printf("%llu",total); 
getch(); 
} 
+1

'((c = getc (fp))! = EOF)'라는 줄에 첫 번째 문자를 사용하고 있습니다. 당신은 그것을 바꿀 필요가 있습니다. :) – Bechir

+0

hoo my! 그것은 볼랜드입니까? 한숨! –

답변

0

이다.

당신은 다음과 독서 루프를 변경할 수 있습니다 루프가 잘못 동안 다음과 같이,

while((c=getc(fp))!=EOF) 
{ 
    fscanf(fp,"%llu",&amt[i]); 
    i++; 
} 

getc()

가 문자를 소비,

while(!feof(fp)) { 
    fscanf(fp,"%llu",&amt[i]); 
    i++; 
} 
+0

feof를 사용하지 않고 fscanf의 결과를 직접 확인하는 것이 더 안전합니다. – Lundin

1

테스트를

while(fscanf(fp,"%llu",&amt[i]) > 0) 
{ 
    i++; 
} 

ungetc() 기능을 사용하여 getc()의 효과를 취소 할 수도 있습니다.

1

이 코드에는 많은 심각한 문제가 있습니다.

명백한 버그 :

  • while 루프, 다른 사람이 이미 지적한다. fscanf의 결과로 바꾸십시오. 이 경우 feof을 사용하지 마십시오.
  • 표준 입력 또는 다른 입력 스트림에서 fflush를 사용할 수 없습니다. 이렇게하면 정의되지 않은 동작이 발생하고 프로그램이 예기치 않은 방식으로 작동을 멈추거나 작동 할 수 있습니다.
  • 프로그램은 컴파일러가 설치된 시스템에서만 작동합니다. 프로젝트에 BGI 라이브러리 객체 파일을 추가해야합니다.
  • 파일이 성공적으로 열렸는지 확인하지 않습니다.
  • fclose으로 전화하지 않으므로 프로그램에서 리소스가 누수되어 불필요하게 파일을 열 수 있습니다.

비표준 횡설수설는 :

  • unsigned long long 당신의 쓰레기 컴파일러가 지원하지 않는 C99 표준 전에 C 언어에 의해 지원되지 않습니다. long long이 컴파일러에서 의미하는 바는 이동식 일 수 있습니다. 마찬가지로 %ll 형식 지정자는 컴파일러에 대해 잘 정의되어 있지 않습니다.
  • 호스트 시스템 (DOS) 용이므로 int main (void)으로 main을 선언하거나 호환되는 C 컴파일러에서 코드를 컴파일하지 않아야합니다.
  • main은 항상 0을 반환하므로 호스트 된 시스템에서 return 0 문을 생략 할 수 없습니다. 이 규칙은 C99에서 완화되었지만 컴파일러가 C99 표준 (또는 실제로 C 표준)을 따르지 않으므로 항상 끝에 return 0을 가져야합니다.

다른 문제 :

  • 는 "매직 넘버"여기 저기 모두 사용 상수를 사용하지 마십시오. const int 또는 #defines.
  • 들여 쓰기가 흐릿하고 읽을 수 없습니다. 2 개 또는 4 개의 공백이 사용됩니다.
  • 함수 및 모듈 식 프로그래밍을 사용해야합니다. 이것은 읽을 수없는 큰 혼란입니다.
  • 절대로 closegraph()를 호출하지 마십시오. 자원 유출이 발생하는지 여부는 확실하지 않습니다.
  • 같은 화면에서 printf와 outtextxy를 섞으면 쓰레기처럼 보일 것입니다. 그러나 다시 한번, 이것은 도스를위한 것이므로 아마도 쓰레기가 필요합니다.
+0

위의 모든 결함을 올바르게 구현하려고 노력할 것입니다. ** ** ** 프로젝트에 ** BGI 라이브러리 개체 파일을 설치하거나 삽입하는 데 도움주세요 ** –

+0

@VipulSonker 기억하는 바에 따르면 새 프로젝트를 만든 다음 터보 C 라이브러리'egavga.bgi'. 그것은 당신이 당신의 프로젝트와 함께 연결할 수있는 종류의 객체 파일입니다. 올바르게 기억하면 프로젝트 폴더에 복사 할 수 있습니다. – Lundin

관련 문제