不要使用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