不要使用feof()
爲您的循環條件;直到你試圖讀取文件末尾之後纔會返回true,這意味着你的循環執行的次數太多了。檢查您輸入調用的結果(無論您使用fgets()
或fscanf()
),看看它是否成功,然後檢查如果feof()
你有一個錯誤的條件。
if (fgets(buffer, sizeof buffer, stream) != NULL)
{
// process the input buffer
}
else if (feof(stream)
{
// handle end of file
}
else
{
// handle read error other than EOF
}
fgets()
讀取整個字符串,而不是單個字符,所以你不希望傳遞的每個個性的地址在您的字符串。說它像這樣代替:
if (fgets(list[i], sizeof list[i], stream) != NULL)
{
// process input address
}
而現在,對於波特的關於數組和指針通常的高談闊論......
當數組表達式出現在大多數情況下,表達的類型隱式轉換而來「的T N元件陣列」到‘指針T’,和表達式的值是數組的第一元素的地址。此規則的例外是當陣列表達是sizeof
或&
運營商的操作數,或它是一個字符串文字正被用作在聲明的初始化。當你聽到人們說「數組和指針是同一件事」時,他們正在篡改這條規則。數組和指針是完全不同的動物,但它們可以在某些情況下互換使用。
請注意,在上面的代碼中,我通過了list[i]
作爲沒有任何裝飾的fgets()的第一個參數(例如&
運算符)。即使的list[i]
類型是「炭的12個元素的數組」,在這種情況下它是隱式轉換爲類型「字符指針」,並且該值將是list[i][0]
地址。請注意,我也將相同的表達式傳遞給sizeof
運算符。在這種情況下,數組表達式的類型是而不是轉換爲指針類型,並且sizeof運算符返回數組類型(12)中的字節數。
只是釘了下去:
Expression Type Implicitly converted to
---------- ---- ----
list char [100][12] char (*)[12] (pointer to 12-element array of char)
list[i] char [12] char *
list[i][j] char N/A
這一切都意味着,fgets()
將讀取到下一個12個字符(只要不打新行或EOF第一),並將其存儲在開始list[i][0]
。請注意,fgets()
將在您的字符串末尾寫入一個終止nul字符(0)。另請注意,如果fgets()
遇到換行和目標陣列中有空間,並且終止nul,fgets()
將在nul字符之前存儲終止換行符。所以,如果你輸入的文件有一個像
1.1.1.1\n
線,在讀取後您的輸入緩衝區的內容將是"1.1.1.1\n\0xxx"
其中x
是一些隨機值。如果你不想換行那裏,你可以使用strchr()
功能找到它,然後用0覆蓋它:
char *newline;
...
if ((newline = strchr(input[i], '\n')) != NULL)
{
*newline = 0;
}
因爲在接下來的換行符fgets()
停止,因爲你的輸入緩衝區的大小爲12個字符,您可能會遇到這樣的情況:您將新行作爲文件中的下一個輸入字符;在這種情況下,fgets()
將只寫入新行到輸入緩衝區,所以你會有一些空的條目,這可能不是你想要的。您可能需要在輸入緩衝區中添加一個額外的字節以避免這種情況。
全部放在一起:
char list[100][13];
...
for (i = 0; i < 100; ++)
{
if (fgets(list[i], sizeof list[i], stream) != NULL)
{
char *newline = strchr(list[i], '\n');
if (newline != NULL)
*newline = 0;
printf("Read address \"%s\"\n", list[i]);
count++;
}
else if (feof(stream))
{
printf("Reached end of file\n");
break;
}
else
{
printf("Read error on input; aborting read loop\n");
break;
}
}
任何錯誤信息? – Nifle 2009-12-03 19:44:46
您是否嘗試啓動調試器?如果通過查看源代碼無法弄清楚發生了什麼問題,這應該始終是您的第一步。 – 2009-12-03 19:45:28
你說「......很明顯有什麼不對。」但你不會說這是什麼錯誤。沒有這個,很難說更多。 是否有錯誤?有沒有輸出,但不是你所期望的? – FrustratedWithFormsDesigner 2009-12-03 19:47:13