2016-06-14 96 views
-6

這是關於我的任務交易程序。我的while循環不起作用,它可以第一次運行,但是當涉及到第二個循環時,它停止工作。 首先,我輸入物品代碼,然後它讀取FILE,然後我「輸入數量」,按Enter後,它會循環回「輸入物品代碼」,這樣我可以輸入另一個物品代碼,但程序在那裏停下來。C編程雖然循環不工作

#include <stdio.h> 

void main() 
{ 
/* declare variables */ 
char gstitem[6], ngstitem[6], gstname[30], ngstname[30], code[6],quit[6]="-1"; 
int gstquant, ngstquant, itemquant, k=0; 
float gstprice, ngstprice, itemtotal, total, gst, subtotal=0; 





printf("Purchase items fuction\n\n"); 
FILE *gstPtr; //pointer to the gst.txt 
FILE *ngstPtr; //pointer to the ngst.txt 
FILE *recPtr; //pointer to the receipt.txt 

ngstPtr = fopen ("ngst.txt","r"); 
gstPtr = fopen ("gst.txt","r"); 
recPtr = fopen ("receipt.txt","w+"); 

fprintf(recPtr,"CODE NAME  QUANTITY PRICE\n"); 




while(strcmp(code, quit) != 0) 
{ 
    printf("Enter an item code, -1 to cancel: ");// enter item code 
    scanf ("%s", code); 


    { 
    while(!feof(gstPtr)) {    
     fscanf (gstPtr, " %5s ; %29[^;] ; %f ; %d\n", gstitem, gstname, &gstprice, &gstquant); 
     { 
      if (strcmp (code, gstitem) == 0) { 
        printf ("Enter quantity, -1 to cancel: "); 
        scanf ("%d", &itemquant); 

         while (itemquant != -1){ 
          if (itemquant <= gstquant) { 
           itemtotal=itemquant*gstprice; 
           gst=itemtotal-itemtotal/1.06; 
           fprintf(recPtr,"%s; %s; %d; %.2f\n" ,gstitem, gstname, itemquant, itemtotal); 
           subtotal+=itemtotal/1.06; 
           totaltrans++; 
           gstsales+=itemtotal; 
           gstcollect+=gst; 
           break; 
          } 
          if (itemquant > gstquant) { 
           printf("Stock not available.\n\n"); 
           break; 
          } 
         } 
         k=1; 
         break; 
      } 

    } 
    } 
    fclose (gstPtr ); 


    while(!feof(ngstPtr)) {  
     fscanf (ngstPtr, " %5s ; %29[^;] ; %f ; %d\n", ngstitem, ngstname, &ngstprice, &ngstquant); 
     { 
      if (strcmp (code, ngstitem) == 0) { 
        printf ("Enter quantity, -1 to cancel: "); 
        scanf ("%d", &itemquant); 

         while (itemquant != -1){ 
          if (itemquant <= ngstquant) {      
           itemtotal=itemquant*gstprice; 
           fprintf(recPtr,"%s; %s; %d; %.2f\n" ,ngstitem, ngstname, itemquant, itemtotal); 
           subtotal+=itemtotal; 
           totaltrans++; 
           ngstsales+=itemtotal; 
           break; 
          } 
          if (itemquant > gstquant) { 
           printf("Stock not available.\n\n"); 
           break; 
          } 
         } 
         k=1; 
         break; 
      } 

    } 
    } 
    fclose (ngstPtr); 

    } 

     if (k == 0) 
     { 
     printf ("Invalid item\n\n"); 

     } 




} 


total=subtotal+gst; 
fprintf(recPtr,"GST    %.2f\n",gst); 
fprintf(recPtr,"TOTAL     %.2f\n",total); 
fclose (recPtr ); 


printf("\n\n"); 
printf("Total gst   : RM%.2f   \n", gst); 
printf("Total price w/o gst  : RM%.2f   \n", subtotal); 
printf("Total price   : RM%.2f  \n", total); 
printf("\n\n"); 


return; 

} 

這是我gst.txt

AG001;July biscuits;5.35;90 
BG001;Maximu Bun;3.50;20 
BG002;Lamli Burger;4.60;15 
CG001;TTT Candy;4.00;42 
CG002;Cappuccino;7.80;30 
CG003;Queenz Cakes;14.00;5 
DG001;Donkey Donuts;3.80;24 
DG002;French Fries;4.30;11 

這是我ngst.txt

AN001;Asam;1.20;90 
BN001;Beef Bone; 20.90;20 
CN001;Chicken Keel;8.00;11 
CN002;Chiili;10.00;46 
CN003;Lesgo Cooking Oil;15.00;52 
GN001;Green Tea;12.00;6 
+7

請參閱['while(!feof(file))'總是出錯](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong)問題。不要寫這樣的循環。另請參閱[在main()函數中返回什麼](http://stackoverflow.com/questions/204476/)爲什麼void main()在非Windows平臺上是錯誤的。 –

+0

就我所見,在第一次迭代中使用它時,「代碼」未初始化;導致未定義的行爲。在外循環的第二次迭代中,你已經關閉了輔助文件('gstPtr'和'ngstPtr'),所以讀取全部立即失敗(儘管我認爲這也是未定義的行爲)。如果要重複使用它們(請倒帶它們),或者在循環中打開它們(並檢查它們是否已成功打開),請不要關閉這些文件。 –

+0

我重新打開了這個,因爲雖然它使用'while(!feof(file))',但這不是失敗的原因。代碼失敗是因爲文件流在外部'while'循環的第一次迭代結束時關閉,並且在下一次迭代使用文件流之前未重新打開。這是一個完全不同的問題。 –

回答

1

你打開你的文件,而循環前處理一次,然後你在它們關閉while循環。當你第二次來時,這些文件被關閉。