C文件I / O,使用TXT文件

时间:2014-12-12 10:55:43

标签: c

我正在学习C语言,我遇到了实施程序的问题 使用test.txt文件作为程序的输入。

test.txt文件的内容是:

  

1 30 30 40 50 60
2 40 30 50 60 60
3 30 20 10 20 30
4 40 20   10 10 30
5 20 10 10 10 30

我试图让每个学生的平均分数为1~5。

所以我实现如下:

while(cnt)      //I set cnt 5 to repeat it for 5 times                     
{         

    fseek(fp, 2, SEEK_CUR);        //to ignore index number in first + blank
    acc=0;                         //clear data in acc
    while(1)
    {
        score=fgetc(fp);

        if(score==' ')         
            fseek(fp, 1, SEEK_CUR);   // if it is black then ignore and move
        else if(score=='\n')          // if I meet enter then break
            break;
        else
        {
            acc+=score;              //get total score of a student
        }
    }
    cnt--;

    printf("%d ", acc/5);           //get average score and print
}

但是程序的结果是

  

58
  58
  58
  58

我无法弄清楚出了什么问题......

他们必须是5个节目输出,因为那里有5个学生

但它只给出了4个学生的平均分数,所有输出都相同..

5 个答案:

答案 0 :(得分:4)

您的代码存在一些问题。其中:

  • 您正在使用fgetc来读取字符,一个字符在a处 时间。如果您想阅读一个,这对于“50”的分数不起作用 一次得分。
  • 您直接使用“fgetc”的结果作为数字。这是 错误:fgetc将返回字符代码,而不是数字。所以,如果你 有{ASCII},当fgetc读取1时,它将返回49。

我建议你尝试使用fscanf("%d", ..)

答案 1 :(得分:1)

fgetc你逐个字符地获取ascii值,这是行不通的。

您可以参考以下代码。

int arr[6];
while(cnt--) {         
    for(acc = 0, i = 0; i < 6; i++) {
        fscanf(fp, "%d", &arr[i]); 
        if (i > 0)
            acc += arr[i];              //get total score of a student
    }
    printf("%d %d\n", arr[0], acc/5);           //get average score and print
}

答案 2 :(得分:0)

很高兴看到有人真正从错误中吸取教训(上一个问题)

首先,如果您事先了解学生人数,则可能应使用for循环代替while
其次,你是以非常复杂的方式做到这一点 - 在循环中读取整行然后使用字符串来解析它可能更简单。

此外,您似乎将数字添加为字符,因此您得到的结果可能是其ASCII码的平均值

答案 3 :(得分:0)

你正在获得单个角色,所以使用这个角色你无法得到真正的答案。

要从文件中获取总输入,您可以使用

char *fgets(char *s, int size, FILE *stream);

然后从字符串中获取输入,您可以使用sscanf。

int sscanf(const char *str, const char *format, ...);

然后使用六个变量来获取输入,包括id no。然后添加五个变量并完成平均值。

 sscanf(s,"%d %d %d %d %d %d",&id,&m1,&m2,&m3,&m4,&m5);

然后avg=(m1+m2+m3+m4+m5)/5".

答案 4 :(得分:0)

这样的东西?

#define MAXSCCORES 5

 FILE *fp = NULL;
fopen_s (&fp, "data.txt","r");

int student = 0;
int score[MAXSCORES];

while (!feof(fp))
{
    int count = fscanf_s(fp,"%d %d %d %d %d %d", &student, &score[0], &score[1], &score[2], &score[3], &score[4] );
    if ( count == MAXSCORES+1 )
    {
        for (int i=1; i<MAXSCORES; i++)
            score[0] += score[i];
        score[0] = score[0] / MAXSCORES;
        printf ("student %d Average Score = %d\n", student, score[0] );
    }
}
fclose(fp);