【发布时间】:2015-06-21 19:41:50
【问题描述】:
我正在尝试读取文本文件并将数据存储在矩阵中。我在读取每一行后打印结果,似乎它正在工作,但如果我在最后打印矩阵,我没有相同的结果。我找不到我做错了什么!
int main()
{
int i,j;
double value[10000][2];
FILE *archivo;
archivo = fopen("pruebas.txt","r");
if (archivo == NULL)
exit(1);
i=0;
while (feof(archivo) == 0)
{
fscanf( archivo, "%lf %lf %lf", &value[i][0],&value[i][1],&value[i][2]);
printf("%10.0f %f %f\n", value[i][0], value[i][1], value[i][2]);
i++;
}
printf("Your matrix:\n");
for(j = 0; j < i; j++)
printf("%10.0f %10.3f %10.3f\n", value[j][0], value[j][1], value[j][2]);
fclose(archivo);
return 0;
}
这是程序的输出:
1 2 3
4 5 6
7 8 9
Your matrix:
1 2 4
4 5 7
7 8 9
【问题讨论】:
-
请在提问前在 SO 上搜索答案。这个问题或类似的问题已经被问过很多次了,并且回答过很多次。你的麻烦是
double value[10000][2];和fscanf( archivo, "%lf %lf %lf", &value[i][0],&value[i][1],&value[i][2]);——你越界访问数组并覆盖东西。 -
while (feof(archivo) == 0)- 请参考 SO 问题stackoverflow.com/questions/5431941/… 您还应该检查来自fscanf()的返回值,在这种情况下为if(3 != fscanf(...)) -
在读取最后一行后,
while (!feof(archivo))将变为true,您可以使用while (fscanf(...) == 3),这不仅可以确保循环执行正确的迭代次数,而且还可以该行包含格式正确的数据。事实上,printf()在fscanf()之后可能会调用未定义的行为。 -
feof()仅在读取操作以前试图读取文件末尾时才通知 true。所以它不会告诉你没有更多要阅读的东西 - 只有当你已经读错了 - 正如@iharob所说,你可以只使用来自fscanf()的返回值进行测试,这样,你也会捕获格式错误的文件。 -
...当然,如果您想读取一个包含三列的矩阵,请对其进行适当的标注,如
double matrix[1000][3]; /* and not 2 */。
标签: c arrays matrix text-files