【问题标题】:Scanning an int array from file从文件中扫描一个 int 数组
【发布时间】:2015-02-17 22:21:19
【问题描述】:

假设有一个名为“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

第一列存储姓名,第二列存储姓氏,第三列存储有关学生参加了多少次测试的数据,后面的数字是他们在每个测试中获得的成绩。

我们还定义了一个结构体“Student”,如下所示:

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 的值,我猜这是由于我用来存储数据的循环中的错误。

【问题讨论】:

  • 我忘记了是否需要在 fscanf() 格式字符串之间包含空格。我会先检查一下。另外,你为什么在你的循环中使用%2d?不应该只是%d吗?
  • 你应该把剩下的代码贴出来,贴出来的代码没有可以帮助识别问题的信息。
  • @JonathanWood 不,空格不是问题,我认为不是。
  • @EmirShemafied 你包含了哪些标题? vel 声明在哪里?
  • 次要:使用"%19s%19s%d",而不是"%7s%12s%8d"namesurname 是 20,不需要限制 nr 的输入宽度。

标签: c


【解决方案1】:

你有几个错误:

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

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

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

  4. 您使用变量 j 迭代并在此处递增 i1

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

    int k;
    
    for(k=0; k<vel; k++)
        fprintf(fout,"%15s %15s %f\n",a[i].name,a[i].surname,avg[i]);
    

这是您的代码修复后可以正常工作

#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复制粘贴代码时要小心。

【讨论】:

  • 好的,谢谢。顺便说一句,我正在使用母语单词的缩写来解决这个问题,显然,当我在这里粘贴代码时,我忘记在某些地方更改它。
  • 有两件事我还不确定。使用 while 循环扫描文件时,指针 fp 是否在扫描文件时“移动”?它如何知道何时从新行读取?
  • 1.指针不移动,FILE * 是一个结构,它有一个位置标记,它确实移动,2. 它不知道,fscanf() 格式字符串完成了这项工作,它扫描与指令匹配的文件加一并忽略空格字符,除了几个指令,因为'\n' 被认为是空格,那么这就是您阅读行的方式。关于错误的变量名,请在编辑器中使用搜索/替换功能进行更改。
猜你喜欢
  • 1970-01-01
  • 2022-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多