如何计算文件每一行的元素数量

时间:2016-03-22 01:59:21

标签: c file fgets fgetc

我试图从文件中读取一些数据(最终进入结构,但现在不重要)并确保此文件在每一行上具有相同数量的数据。每行可以有单词或数字,所以我已经将一行文件转换成一个大字符串。然后我尝试使用strtok和逗号(将数据分开)将此字符串拆分为标记作为分隔符。但是我如何计算逗号之间存在的令牌数量。 我试着计算每一行的逗号数量,但出于某种原因,它的表现并不像我预期的那样。文件中的每一行都有5个数据,全部用逗号分隔,所以每行应该有4个逗号。

 while (fgets(string, sizeof(string), f)) {
    input = fgetc(f);
        if(input == ','){
            i++;        
        }
        else if (input == ' '){
            printf("Error");
            exit(0);
        }
   }

    if(i % 4 != 0){
        printf("Error");
        exit(0);
    }   

这里我试图计算每一行上的逗号数量(如果文件行上有一个空格,它应该显示错误,因为我只需要用逗号分隔数据)。最后在fgets停止阅读之后,我想看看“i”变量是否是4的倍数。我确定有一种更有效和用户友好的方式来做到这一点,但我想不出一个。

快速问题:fgetc是否会在其余命令继续之前运行该行中的每个字符,或者一旦遇到逗号,我的程序将在下一个循环中继续运行?

谢谢!

1 个答案:

答案 0 :(得分:0)

要计算每行文件的逗号,您需要知道文件中的确切行分隔符。然后,您可以迭代文件,直到文件结束,并在行内计算逗号。

在下面的示例中,我假设'\ n'是行分隔符。

#define DESIRED_COMMAS_COUNT 4
int commas_per_line = 0;
bool prev_is_comma = false;
int c;
while ((c = fgetc(f)) != EOF) //This expression reads one characters from file and checks for end-of-file condition
{
  switch(c)
  {
    case ',': 
      commas_per_line++; 
      if (prev_is_comma)
      {
        printf("Two successive commas! Empty element in line\n");
        exit(1);
      }
      prev_is_comma = true;
      if (commas_per_line > DESIRED_COMMAS_COUNT)
      {
        printf("Error: too many commas at line. At least %d.\n", commas_per_line);
        exit(1);
      }
      break;
    case ' ': 
      printf("Error: space encountered!\n"); 
      exit(1);
    case '\n': 
      if (commas_per_line != DESIRED_COMMAS_COUNT)
      {
        printf("Error: too low commas (%d)", commas_per_line);
        exit(1);
      }
      if (prev_is_comma)
      {
        printf("Line ends with comma: no last element in line\n");
        exit(1);
      }
      commas_per_line = 0; 
      break;
    default:
      prev_is_comma = false;
  }
}
if ((commas_per_line != DESIRED_COMMAS_COUNT) && //check commas count for last line in file
    (commas_per_line != 0))
{
  printf("Error: too low commas (%d)", commas_per_line);
  exit(1);
}