如何从.text中读取单独的数字/行,并将它们输入到2个不同的数组中

时间:2013-03-22 23:55:10

标签: c

我正在尝试编写一个从.txt读取行的程序,并将它们输入到2个不同的数组中。

到目前为止,我有这个:

    #include <stdio.h>

    int main() {
        FILE * ifp = fopen("input.txt","r"); 
        FILE * ofp = fopen ("output.txt", "w"); 
        int participants = 0, i;  
        char name [10];
        float grade [10];
        float perc [10];

        fscanf(ifp, "%d", &participants);

        for (i=1; i<participants; i++) {
             fscanf(ifp, "%s", &name);

             fscanf(ifp, "%f", &grade);

        }

        printf( "%d\n", participants);
        printf( "%s\n", name);
        printf( "%f\n", grade);

        fclose(ifp);
        fclose(ofp);

        return 0;
    }

我想读的txt是:

    2 
    Optimus 
    45 90 
    30 60 
    25 30 
    50 70 
    Megatron 
    5 6 
    7 9 
    3 4 
    8 10 

我的问题是,它获取了前两行,但是当它到达数字时停止。我试图将名称分成一个数组和所有数字,成对出现在另一个数组中。现在我只是想检查一下,看看我是否在拾取数组中的数字,但它并没有把它们全部拿起来。

这是我得到的输出:

    2
    Optimus
    0.000000

有什么想法吗?

修改

经过一些更改之后,这是我的新代码:

    #include <stdio.h>

    int main() {
        FILE * ifp = fopen("input.txt","r");
        FILE * ofp = fopen ("output.txt", "w");
        int participants = 0, i , j; 
       char name [10];
        int grade [26];
        float perc [26];

        fscanf(ifp, "%d", &participants);

        for (i=1; i<participants; i++) {
             fscanf(ifp, " %s", name);
             fscanf(ifp, " %d", grade);

        }

        printf( "%d\n", participants);
        printf( "%s\n", name);
        printf( "%d\n", grade[0]);

        fclose(ifp);
        fclose(ofp);

      return 0;
    }

我的新输出是:

    2
    Optimus
    45

编辑2

稍后我需要对这些数字做的是将第一个数字除以同一行中的第二个数字,乘以10,然后根据数字显示“*”。所以它会打印出来像这样:

    Optimus
    +:  *****
    -:  *****
    *:  ********
    /:  *******
    Megatron
    +:  ********
    -:  *******
    *:  *******
    /:  ********

“+”是名称下的第一行。 “ - ”是同名下的第二行。 “*”代表第三名。 “/”为第四个。

2 个答案:

答案 0 :(得分:1)

这是你的主要问题:

    printf( "%f\n", grade);

您正尝试将指针打印为浮动。你想要grade[0]

在这一行:

    fscanf(ifp, "%f", &grade);

这样可行,但不正确。它应为&grade[0]或仅grade

当然,在最终版本中,您需要调整数组下标。您还需要为名称分配更多数组 - 您目前只能存储一个数组。

要读入数据,您需要经常更改程序。您可以将grade声明为grade[10][8](假设最多10个参与者),并将8个整数中的每一个存储在数组中。像这样的循环会处理它:

   for (i = 0; i < participants; i++) {
      fscanf(ifp, "%s", name);             // read the name (you need to fix this)
      for (j = 0; j < 8; j++) {
        fscanf(ifp, "%d", &grade[i][j]);   // store each number
      }
   }

答案 1 :(得分:0)

namegrade是数组 - 变量的地址对于数组是隐式的。所以地址运算符不应该用于这些变量。

fscanf(ifp, "%s", name);
fscanf(ifp, "%f", grade);