簡體   English   中英

使用 fscanf 時無限循環

[英]infinite while loop while using fscanf

我寫了這個 C function 因為我還在大學學習,我目前正在研究文件,這段代碼正在運行一個無限循環,而我 go 到案例 1

void input() {
    int hasil[1];
    int tambah[1];
    int i;
    int z = 0;
    int a;
    int c = 0;
    wDATA = fopen("Data.txt", "a");
    rDATA = fopen("Data.txt", "r");
    wDATAs = fopen("DataS.txt", "a");

    while (fscanf(rDATA, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^\n]\n", operator[z], mode[z], jenis[z], jumlah[z], rak[z], tanggal[z]) != EOF) {
        printf("test");
        z++;
    }

    printf("======= Input Barang =======\n");
    printf("Jenis Barang \t\t: ");
    scanf("%s", &jeniss);

    for (i = 0; i < z; i++) {
        if (strstr(strupr(jeniss), jenis[i])) {
            printf("Jumlah barang \t\t: ");
            scanf("%i", &tambah[0]);
            hasil[0] = jumlah[i][0] + tambah[0];
            jumlah[i][0] = hasil[0];
            printf("Tempat penyimpanan \t: ");
            scanf("%s", &rak[i]);
            fprintf(wDATAs, "%s;", operator);
            fprintf(wDATAs, "%s;", mode[i]);
            fprintf(wDATAs, "%s;", jenis[i]);
            fprintf(wDATAs, "%i;", jumlah[i]);
            fprintf(wDATAs, "%s;", rak[i]);
            fprintf(wDATAs, "%s", __DATE__);
            fprintf(wDATAs, "%s", __TIME__);
        }
        else {
            fprintf(wDATAs, "%s;", operator);
            fprintf(wDATAs, "%s;", mode[i]);
            fprintf(wDATAs, "%s;", jenis[i]);
            fprintf(wDATAs, "%i;", jumlah[i]);
            fprintf(wDATAs, "%s;", rak[i]);
            fprintf(wDATAs, "%s;", tanggal[i]);
        }

        remove("Data.txt");
        rename("DataS.txt", "Data.txt");
        c = 1;
    }

    if (c == 0) {
        printf("Jenis Barang \t\t: ");
        scanf("%s", jenis[a]);
        printf("Jumlah barang \t\t: ");
        scanf("%s", jumlah[a]);
        printf("Tempat penyimpanan \t: ");
        scanf("%s", rak[a]);
        fprintf(wDATA, "Input Barang;");
        fprintf(wDATA, "%s;", strupr(jenis[a]));
        fprintf(wDATA, "%s;", jumlah[a]);
        fprintf(wDATA, "%s;", rak[a]);
        fprintf(wDATA, "%s", __DATE__);
        fprintf(wDATA, " %s\n", __TIME__);
        a = a + 1;
    }

    fclose(wDATA);
    fclose(wDATAs);
    fclose(rDATA);
}

*我在while循環中打印測試,因為我想知道它是如何工作的,我發現它循環無窮大*對不起我的英語不好

使用讀取文件

while (fscanf(rDATA, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^\n]\n", .... ) != EOF) {

不好有幾個原因。 其中之一是如果fscanf無法匹配任何內容,它可能會導致無限循環 在這種情況下, fscanf返回 0(零)並且它不會在文件中前進。 因此,您永遠不會到達 EOF,因此您有一個無限循環。

例如,如果文件包含以;開頭的行,則上述情況可能發生在您的代碼中。

而不是使用fscanf使用fgets讀取整行,然后進行解析,例如使用sscanf

順便說一句:當使用其中一種scan功能時,您應該始終檢查返回值以查看您獲得了多少匹配項。 例如,您的代碼盲目地期望 6 個匹配項,但如果輸入文件有意外數據,您可能會得到更少。 您的代碼需要檢查...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM