Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:如何使用strtok从输入文件输出成绩&;找到平均值、最小值和最大值?_C_Strtok_Text Parsing - Fatal编程技术网

C:如何使用strtok从输入文件输出成绩&;找到平均值、最小值和最大值?

C:如何使用strtok从输入文件输出成绩&;找到平均值、最小值和最大值?,c,strtok,text-parsing,C,Strtok,Text Parsing,我试图从输入文件中输出作业的分数,并输出每个作业的平均、最低和最高分数 例如,包含4名学生和3项作业的班级的输入文件可能如下所示: 8.5, 10.5, 90.5 49.5, 99, 97 88, 88, 100 88.5, 99, 0 输出应该是 Student grades from the input file: 8.5, 10.5, 90.5 49.5, 99.0, 97.0 88.0, 88.0, 100.0 88.5, 99.0, 0.0 Assignment # 1 stats

我试图从输入文件中输出作业的分数,并输出每个作业的平均、最低和最高分数

例如,包含4名学生和3项作业的班级的输入文件可能如下所示:

8.5, 10.5, 90.5
49.5, 99, 97
88, 88, 100
88.5, 99, 0
输出应该是

Student grades from the input file:
8.5, 10.5, 90.5
49.5, 99.0, 97.0
88.0, 88.0, 100.0
88.5, 99.0, 0.0

Assignment # 1 stats
avg = 58.6
min = 8.5
max = 88.5

Assignment # 2 stats
avg = 74.1
min = 10.5
max = 99.0

Assignment # 3 stats
avg = 71.9
min = 0.0
max = 100.0
到目前为止,我还停留在第一部分,我必须输出文件的内容。这就是我迄今为止所拥有的,如果能在这方面或功能上提供任何帮助,我将不胜感激

intmain(intargc,char*argv[]){
文件*输入文件;
int line_number=0;
char*next_字段;
字符行[MAX_STUDENTS+1];
input_file=fopen(argv[1],“r”);
//从输入文件中输出等级
而(1){
fgets(行、最大学生数、输入文件);
if(feof(输入文件))
打破
下一个字段=strtok(第“\n”行);
while(下一个_字段!=NULL){
printf(“====================================================/n”);
printf(“输入文件中的学生成绩/n”);
printf(“====================================================/n”);
printf(“%s”,下一个字段);
next_field=strtok(空,“\n”);
}
}

您可以这样标记和输出:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>

#define MAX_LINE_LEN 1024

int main(int argc, char **argv) 
{
  int   line_number = 0;
  FILE *input_file;
  char  line[MAX_LINE_LEN + 1];
  char *next_field;
  char *end_field;

  if (1 == argc)
  {
    fprintf(stderr, "usage: %s <filename>\n", argv[0]);
    exit(1);
  }

  if (NULL == (input_file = fopen(argv[1], "r")))
  {
    perror(argv[1]);
    exit(1);
  }

  fprintf(stdout, "Student grades from the input file:\n");

  while (fgets(line, sizeof(line), input_file))
  {
    int first = 1;

    ++line_number;

    for (next_field = strtok(line, ",\n"); NULL != next_field; next_field = strtok(NULL, ",\n")) 
    {
      errno = 0;

      double grade = strtod(next_field, &end_field);

      if (errno || end_field == next_field || *end_field)
      {
        fprintf(stderr, "Warning: malformed input '%s'? Skipping!\n", next_field);
        continue;
      }

      fprintf(stdout, "%s%.1lf", (first ? "" : ", "), grade);
      first = 0;

      // TODO: store grade (or at least running min, max, avg) in a structure that stores assignments stats for later processing and printing
    }

    if (!first)
      fprintf(stdout, "\n");
  }

  return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义最大线长度1024
int main(int argc,字符**argv)
{
int line_number=0;
文件*输入文件;
字符行[最大行长度+1];
char*next_字段;
字符*结束_字段;
如果(1==argc)
{
fprintf(stderr,“用法:%s\n”,argv[0]);
出口(1);
}
if(NULL==(输入文件=fopen(argv[1],“r”))
{
perror(argv[1]);
出口(1);
}
fprintf(stdout,“输入文件中的学生成绩:\n”);
while(fgets(行、sizeof(行)、input_文件))
{
int first=1;
++线号;
for(next_field=strtok(第,,\n行);NULL!=next_field;next_field=strtok(NULL,,\n”))
{
errno=0;
双级=strtod(下一个字段和结束字段);
if(errno | | end | u字段==下一个| |*end | u字段)
{
fprintf(标准,“警告:格式错误的输入“%s”?跳过!\n”,下一个\u字段);
继续;
}
fprintf(标准符号,“%s%.1lf”,(第一个?”:“,”,等级);
第一个=0;
//TODO:将等级(或至少运行min、max、avg)存储在一个存储分配统计信息的结构中,以供以后处理和打印
}
如果(!第一个)
fprintf(标准输出,“\n”);
}
返回0;
}
您需要在某种结构中存储关于每个分配的统计信息,以便在读取完所有输入后可以打印出分配统计信息

请注意,我用“,\n”而不是“\n”来调用
strtok
,因为我认为逗号确实是输入中的重要分隔符。至少,.csv文件通常是这样的,它是用于分隔要处理的数据的常用格式

请注意,我们的两种方法都会对不同类型的输入做一些令人担忧的事情。例如,如果一行看起来像
“7.0,8.0,9.0,10.0\n”
,这在.csv文件中很常见。您的程序可能只处理
7.0
,而忽略该行的其余部分。您的程序也可能不反对像
“7.0,迄今为止是8.0,9.0\n”
。然后,您的程序可能会像处理
一样处理
“7.0 8.0 9.0,10.0\n”
“7.0、8.0、9.0、10.0\n"
即使前一个字符串中缺少了一些逗号。这是好还是坏?答案取决于您的输入文件格式以及您对其结构的要求有多严格。对于前一个字符串,我的标记化方法将反对
7.0
后面没有紧跟
'、
'\n'
de>'\0'在原始输入中,但在数字开始之前允许空白,这是一种有点奇怪的对空白的不对称处理。它还可以轻松地处理
“7.0,,,,,,10.0\n”
,甚至不会注意到行上的“缺失”字段


因此,您需要弄清楚您希望自己有多挑剔,以及您希望在程序中处理错误的能力有多好。

字符行[MAX_STUDENTS+1];
应该重新考虑。字符串通过使用
strtod转换为double
。小调:许多人认为“行长度”不包括
'\n'
,建议使用
字符行[MAX_LINE_LEN+2];