while循环中的无限循环

时间:2013-01-10 01:12:51

标签: c loops infinite

fp=fopen("Product.dat","rb+");
while (fread(&prod,sizeof (prod),1,fp)==1) {
    prod.stockquant = prod.stockquant + prod.stockorderquant;
    prod.stockorderquant = 0;
    fseek(fp, -sizeof(prod), SEEK_CUR);
    fwrite (&prod, sizeof(prod), 1, fp);
}
fclose (fp);

一旦进入while循环,我就会得到一个无限循环。 文件指针是fp,prod是结构中名为PRODUCT,stockquant和stockorderquant ara变量的Struct的实例。我试图改变stockquant和stockorderquant的值。这是我为我的项目做的批量更新。我正在尝试浏览名为product.dat的整个文件,同时编辑每个产品的stockquant和orderquant。

为什么我会得到无限循环? 当我在检查prod.id = userinput的if语句中使用它时,此方法似乎有效。

任何帮助?

一些额外的代码:

void batchupdate(void) { 
    system("cls");
    FILE *fp;
    int c=0;
    gotoxy(20,4);
    printf("****Batch Update Section****");
    char another='y';
    while(another=='y')
    {
        system("cls");
        gotoxy(15,6);
        printf("Are you sure you want to Batch update (Press Y or N)?");

        if((getch()=='y') || (getch() == 'Y')) {
        system("cls");
        int pos;

        fp=fopen("Product.dat","rb+");
        while(fread(&prod,sizeof(prod),1,fp)==1) {
                prod.stockquant = prod.stockquant + prod.stockorderquant;
                product.stockorderquant = 0;

                fseek(fp, -(sizeof(prod)), SEEK_CUR);
                fwrite (&prod, sizeof(prod), 1, fp);
                getchar();
                pos = ftell(fp);
                printf("%d",&pos);


        }
        fclose (fp);

        gotoxy(15,16);
        printf("Complete");
        gotoxy(15,18);
        printf("All products stock quantity have been updated. The stock order quantity has been reset");

        gotoxy(15,16);
        printf("Do you want to modify another product?(Y/N)");
        fflush(stdin);
        another=getch() ; }

    else { if((getch()=='n') || (getch() == 'N')) {
                mainmenu();
           }
    }
}
    returnfunction();
}

这就是我列出我的产品的方式(并且它有效!)(请注意,此处显示的订单数量与stockorderquant无关

void listproduct(void)  
{
    int x;
    FILE *fp;
    system("cls");
    gotoxy(1,1);
    printf("*********************************Product List*****************************");
    gotoxy(2,2);
    printf("Name              ID    Price  StockQuant  Order Quant  Description");
    x=4;
    fp=fopen("Product.dat","rb");
    while(fread(&prod,sizeof(prod),1,fp)==1){
        gotoxy(2,x);
        printf("%s",prod.prodname);
        gotoxy(20,x);
        printf("%d",prod.prodid);
        gotoxy(26,x);
        printf("%.2f",prod.price);
        gotoxy(34,x);
        printf("%d",prod.stockquant);
        gotoxy(46,x);
        printf("%d",prod.orderquantity);
        gotoxy(59,x);
        printf("%s",prod.description);
        printf("\n\n");
        x++;
    }
    fclose(fp);
    gotoxy(35,25);
    returnfunction();
}

我的结构定义如下:

struct PRODUCT
{
    int id;
    char name[30];
    char desc[50];
    float price;
    int stockquant;
    int orderquant;
    int stockorderquant;
};

struct PRODUCT prod;

6 个答案:

答案 0 :(得分:3)

让我引用fopen的手册页:

  

读取和写入可以以任何顺序混合在读/写流上。请注意,ANSI C要求输出和输入之间的文件定位功能介入,除非输入操作遇到文件结尾。 (如果不满足此条件,则允许读取返回最近的写入结果。)因此,放置fseek(3)或{{fgetpos(3)或{{{ 1}}在这样的流上进行写操作和读操作之间的操作。此操作可能是明显的无操作(如在    fseek(..., 0L, SEEK_CUR)要求同步副作用。

写完后调用fseek

fseek(fp, -sizeof(prod), SEEK_CUR);
fwrite (&prod, sizeof(prod), 1, fp);
fseek(fp, 0, SEEK_CUR);

应该解决它。

答案 1 :(得分:2)

问题在于

fseek(fp, -sizeof(prod), SEEK_CUR);

将当前指针sizeof(prod)移动到当前文件指针之前,下一次读取将读取相同的记录,然后移动,等等。

Hece,无限循环。

实际上它只读取第一条记录。

答案 2 :(得分:1)

句子

fwrite (&product, sizeof(prod), 1, fp);

尝试在文件中存储一个名为product的结构而不是prod,并且可能会返回一个错误(未选中),这将阻止指针移动到下一个要读取的记录,使这段代码一次又一次地读取相同的记录。

您应该存储刚更改的prod变量,并且不要忘记检查错误

if (fwrite (&prod, sizeof(prod), 1, fp)==-1)
    perror("fwrite error");

答案 3 :(得分:0)

您将遇到值-sizeof(prod)的问题,因为sizeof会返回无符号值。当你否定它时,它会变成一个非常大的值,然后你隐式地将它强制转换为long int

试试这个:

fseek(fp, -(int)sizeof(prod), SEEK_CUR);

此外,您需要测试fwrite成功或者您将继续倒带。

答案 4 :(得分:0)

我相信你有一个无限循环,你总是重新调整文件位置指示器:

fseek(fp, -sizeof(prod), SEEK_CUR);

所以你读了一个元素然后重新学习它并且总是无限地读取相同的元素。

答案 5 :(得分:0)

' long'中第二个默认参数类型fseek()。您需要输入“长”字样。即 fseek(fp, - (long)sizeof(prod),SEEK_CUR);