2013-04-09 4 views
-1

Я читаю из файла (содержащий номера, разделенные символом новой строки) и вычисляя сумму. Проблема заключается в том, что при чтении файла и хранении суммы в массиве он пропускает первую букву первой суммы, например: - если первая строка имеет 324, тогда она будет читать 24, и если в строке будет 3, тогда она станет мусором vale, но остальная часть линии в порядке.Чтение первой строки файла не работает

Код

#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

Вы потребляете первый символ этой строкой 'while ((c = getc (fp))! = EOF). Вы должны это изменить. :) – Bechir

+0

hoo my! это борланд? вздох! –

ответ

0

Первый символ потребляется функцией getc.

Вы можете изменить свой цикл чтения следующим образом:

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

Лучше и безопаснее не использовать feof, но проверить результат fscanf напрямую. – Lundin

1

The пока петля не так,

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

getc() потребляет характер,

тест следующим образом,

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

Вы также можете использовать функцию ungetc() для отмены эффектов getc().

1

С этим кодом возникают многочисленные серьезные проблемы.

Очевидные ошибки:

  • Петля в то время как другие уже указывали. Замените его проверкой результата fscanf. Не используйте для этого feof.
  • fflush не может использоваться на stdin или любом другом входном потоке. Это вызывает неопределенное поведение, и ваша программа может сбой или ведение себя непредвиденными способами.
  • Ваша программа будет работать только в системе, в которой установлен компилятор. Вам необходимо добавить объект объекта библиотеки BGI в свой проект.
  • Вы не проверяете, был ли файл успешно открыт или нет.
  • Вы не вызываете fclose, поэтому ваша программа создает утечки ресурсов и бесполезно держит файлы открытыми.

Нестандартные тарабарщина:

  • unsigned long long не поддерживается языком C до стандарта C99, который ваш дерьмо компилятор не поддерживает. Независимо от того, что означает 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, поэтому, возможно, дерьмо желательно.
+0

Я попробую все вышеуказанные недостатки, чтобы правильно реализовать. ** И ** Пожалуйста, помогите мне установить или вставить ** объект объекта объекта BGI в ваш проект. ** –

+0

@VipulSonker Из того, что я помню, вы создаете новый проект, затем добавляете файл из Turbo C библиотека под названием «egavga.bgi». Это объектный файл, который вы можете связать вместе с вашим проектом. Если я правильно помню, вы можете скопировать его в папку проекта. – Lundin

Смежные вопросы