从txt文件读取数字矩阵

时间:2018-08-22 14:16:30

标签: c matrix input

因此,我在文本文件上创建了一个矩阵,如下所示:

1.0#2.2#3.4
3.4#5.5#1.0
6.6#5.5#1.0

我需要我的脚本读取行上的每个数字,将它们相加,然后创建一个新矩阵,其结果是将每个数字除以整行的总和。 示例:

1.0+2.2+3.4 = 6.6

我将创建的第二个矩阵的第一行是:

0.15#0.33#0.51 (because 1.0/6.6 is 0.15 etc.)

现在我可以打印整个矩阵,但是我不知道如何将行的每个数字保存为变量并将其添加到下一个数字,对此有何建议?

这是我目前的工作

#include <stdio.h>
#include <stdlib.h> 

int main() {
    FILE *fptr;
    double c;

    // Open file
    fptr = fopen("mat.txt", "r");
    if (fptr == NULL) {
        printf("Cannot open file \n");
        exit(0);
    }

    // Read contents from file
    c = fgetc(fptr);
    while (c != EOF) {
        printf ("%c", c);
        c = fgetc(fptr);
    }

    fclose(fptr);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

假设您的matrix的大小始终为3*3,而#是分隔符,在这种情况下,您可以使用fscanf在while循环中读取3个值,如下所示

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fptr;
    double a=0,b=0,c=0;
    double matrix[3][3];

    // Open file
    fptr = fopen("mat.txt", "r");
    if (fptr == NULL)
    {
        printf("Cannot open file \n");
        exit(0);
    }

    int i =0;
   /*fscanf reads the 3 values each time into a,b and c*/
    while (fscanf(fptr,"%lf#%lf#%lf", &a,&b,&c) == 3)
    {
        double sum = a+b+c;
        matrix[i][0] = a/sum;
        matrix[i][1] = b/sum;
        matrix[i][2] = c/sum;
        i++;
    }

    for (i=0;i<3;i++)
     printf ("%lf %lf %lf\n", matrix[i][0],matrix[i][1],matrix[i][2]);

    fclose(fptr);
    return 0;
}

答案 1 :(得分:0)

以下方法使用动态内存分配

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main()
{
    size_t x = 3, y = 3;
    int ret, i, j;
    FILE *fptr_in , *fptr_out;
    double (*d)[y], sum = 0;
    d = malloc( sizeof(double) * x * y );
    assert(d != NULL);
    // Open file
    fptr_in = fopen("mat.txt", "r");
    assert(fptr_in != NULL);

    /*file to write output*/
    fptr_out = fopen("mat_out.txt", "w");
    assert(fptr_out != NULL);

    for(i = 0; i < x; i++){
        sum = 0;
        for(j = 0; j < y; j++){
            ret = fscanf(fptr_in, "%lf", &d[i][j]);
            assert(ret > 0);
            sum += d[i][j];
        }
        for(j = 0; j < x; j++){
            ret = fprintf(fptr_out, "%lf ", d[i][j]/sum);
        }
        fprintf(fptr_out, "\n");
    }
    free(d);
    fclose(fptr_in);
    fclose(fptr_out);
    return 0;
}