[英]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.