【问题标题】:Reading a matrix from a text file in c从c中的文本文件中读取矩阵
【发布时间】: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", &amp;value[i][0],&amp;value[i][1],&amp;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


【解决方案1】:

您声明double value[10000][2];,但随后访问value[i][2]。用[2] 声明的数组包含2 个元素,索引为01。访问索引“2”正在覆盖其他内存。

使用

double value[10000][3];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多