-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
請參閱['while(!feof(file))'總是出錯](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong)問題。不要寫這樣的循環。另請參閱[在main()函數中返回什麼](http://stackoverflow.com/questions/204476/)爲什麼void main()在非Windows平臺上是錯誤的。 –
就我所見,在第一次迭代中使用它時,「代碼」未初始化;導致未定義的行爲。在外循環的第二次迭代中,你已經關閉了輔助文件('gstPtr'和'ngstPtr'),所以讀取全部立即失敗(儘管我認爲這也是未定義的行爲)。如果要重複使用它們(請倒帶它們),或者在循環中打開它們(並檢查它們是否已成功打開),請不要關閉這些文件。 –
我重新打開了這個,因爲雖然它使用'while(!feof(file))',但這不是失敗的原因。代碼失敗是因爲文件流在外部'while'循環的第一次迭代結束時關閉,並且在下一次迭代使用文件流之前未重新打開。這是一個完全不同的問題。 –