-1

我正在读取文件(包含由换行符分隔的数字)并计算金额。问题是在读取文件并将数量存储在数组中时,它会跳过第一个数量的第一个字母,例如:- 如果第一行有 324,那么它将读取 24,如果该行有 3,那么它将变成垃圾淡水河谷,但其余部分都很好。

代码是

#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();
}
4

3 回答 3

1

while 循环是错误的,

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

getc()消耗一个字符,

测试如下,

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

您也可以使用该功能ungetc()取消 的效果getc()

于 2013-04-09T15:11:50.607 回答
1

这段代码有很多严重的问题。

明显的错误:

  • 正如其他人已经指出的那样,while 循环。用检查结果替换它fscanf。不要feof用于此。
  • fflush 不能用于标准输入或任何其他输入流。这会调用未定义的行为,您的程序可能会崩溃或以意想不到的方式运行。
  • 您的程序只能在安装了编译器的系统上运行。您需要将 BGI 库对象文件添加到您的项目中。
  • 您不检查文件是否已成功打开。
  • 您不调用fclose,因此您的程序会造成资源泄漏并不必要地保持文件打开。

非标准乱码:

  • unsigned long long在 C99 标准之前,C 语言不支持,你的垃圾编译器不支持。无论long long您的编译器意味着什么,它都可能是不可移植的。同样,%ll格式说明符也没有为您的编译器明确定义。
  • 由于这是用于托管系统 (DOS),因此您必须将 main 声明为,int main (void)否则您的代码将无法在符合标准的 C 编译器上编译。
  • 由于 main 始终返回 0,因此您不能return 0在托管系统上省略该语句。这个规则在 C99 中被放宽了,但是由于你的编译器不符合 C99 标准(或者实际上任何 C 标准),你必须总是return 0在最后。

其他问题:

  • 不要到处使用“幻数”,使用常量。要么const int或#defines。
  • 你的缩进是晦涩难懂的。2 或 4 个空格是惯例。
  • 您必须使用函数和模块化编程。这只是一个难以理解的大混乱。
  • 你永远不会调用 closegraph()。这是否会造成资源泄漏,我不确定。
  • 在同一个屏幕上混合 printf 和 outtextxy 看起来像废话。但是话又说回来,这是针对 DOS 的,所以可能需要废话。
于 2013-04-09T15:39:14.557 回答
0

函数使用第一个字符getc

您可以按如下方式更改阅读循环:

while(!feof(fp)) {
    fscanf(fp,"%llu",&amt[i]);
    i++;
}
于 2013-04-09T15:11:35.137 回答