从文件中扫描int数组

时间:2015-02-17 22:21:19

标签: c

假设有一个名为' input'的文件。看起来像这样:

             Joyle       Hughes       5    6 7 6 9 10
              Marc        Gasol       3    9 10 8
              Yuki     Yamamoto       5    10 10 10 10 10
             Milan      Francis       4    9 9 9 8

第一列存储名称,第二列存储名称,第三列存储有关学生已完成测试的数据,以及后面的数字是他们在每一项上获得的成绩。

我们还有一个结构'学生'定义如下:

struct Student {
    char name[20];
    char surname[20];
    int nr;
    int arr[50];
};

我的任务是将文件中的所有数据存储到struct Student数组中,并计算每个学生的平均成绩。 我遇到的麻烦实际上是将等级存储在一个int数组中。这是我尝试的方式:

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

int main()
{
    struct Student a[1000];
    int len= function(a,1000);

    int i,j;
    int sums[1000]= {0};
    for(i=0; i<len; i++) {
        for(j=0; j<a[i].nr; i++)
            sums[i]+=a[i].arr[j];
    }
    float avg[1000];
    for(i=0; i<len; i++) {
        avg[i]=(float)suma[i]/a[i].nr;
    }
    FILE *fout=fopen("output.txt","w");
    int k;
    for(k=0; k<len; k++)
        fprintf(fout,"%15s %15s %f\n",a[i].name,a[i].surname,avg[i]);
    fclose(fout);


    return 0;
}

int function(struct Student *s,int len)
{
    FILE *fp;
    fp=fopen("input.txt","r");
    if(fp==NULL)
        exit(1);
    int i=0;
    while((fscanf(fp,"%7s%12s%8d",s[i].name,s[i].surname,&s[i].nr))==3) {
        int k;
        for(k=0; k<s[i].nr; k++) {
            fscanf(fp,"%2d",&s[i].arr[k]);
        }
        i++;
    }
    fclose(fp);
    return i;
}

当我尝试打印平均成绩时,我看到的是0.0000的值,我想这是由于我用来存储数据的循环中的错误。

1 个答案:

答案 0 :(得分:0)

您有几个错误:

  1. 您不包含任何头文件,这会导致编译器假定所有标准库函数都返回int,因此它们无法按预期工作。在您的情况下,最糟糕的是fopen()

  2. 您在function()中致电main(),但未提供声明。

  3. vel未声明,我认为是因为您没有将编辑器中的代码复制并粘贴到您的问题中。

  4. 您使用变量j进行迭代并在此处增加i 1

    for(j=0; j<a[i].nr; i++)
    
  5. 您使用变量k进行迭代,并在循环体 1 中使用i

    int k;
    
    for(k=0; k<vel; k++)
        fprintf(fout,"%15s %15s %f\n",a[i].name,a[i].surname,avg[i]);
    
  6. 这是您修复的代码以便正常工作

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Student {
        char name[20];
        char surname[20];
        int nr;
        int arr[50];
    };
    
    int function(struct Student *s,int len);
    
    int main()
    {
        struct Student a[1000];
        int            i;
        int            sums[1000] = {0};
        int            len;
        float          avg[1000];
        FILE          *fout;
    
        len = function(a, 1000);
        for (i = 0 ; i < len ; i++)
        {
            int j;
            for (j = 0 ; j < a[i].nr ; j++)
                sums[i] += a[i].arr[j];
        }
        for (i = 0 ; i < len ; i++)
            avg[i] = (float)sums[i] / a[i].nr;
        fout = fopen("output.txt","w");
        if (fout == NULL)
            return -1;
        for (i = 0 ; i < len ; i++)
            fprintf(fout,"%15s %15s %f\n", a[i].name, a[i].surname, avg[i]);
        fclose(fout);
        return 0;
    }
    
    int function(struct Student *s,int len)
    {
        FILE *fp;
        int   i;
    
        i  = 0;
        fp = fopen("input.txt", "r");
        if (fp == NULL)
            exit(1);
        while ((fscanf(fp, "%19s%19s%d", s[i].name, s[i].surname, &s[i].nr)) == 3)
        {
            int k;
            k = 0;
            while ((k < s[i].nr) && (fscanf(fp, "%2d", &s[i].arr[k]) == 1))
                k += 1;
            i++;
        }
        fclose(fp);
    
        return i;
    }
    

    1 复制和粘贴代码时要小心。