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

C 如何计算文件每行的元素数量,c,file,fgets,fgetc,C,File,Fgets,Fgetc,我试图从一个文件中读入一些数据(最终读入一个结构中,但目前并不重要),并确保该文件的每行数据量相等。每一行都可以有单词或数字,所以我将文件的一行转换为一个大字符串。然后,我尝试使用strtok和逗号(分隔数据)作为分隔符,将该字符串拆分为标记。但是我如何计算逗号之间存在的令牌数量呢。 我试图计算每行的逗号数量,但由于某些原因,它的行为与我预期的不一样。文件中的每一行有5个数据段,全部由逗号分割,因此每一行上应该有4个逗号 while (fgets(string, sizeof(string),

我试图从一个文件中读入一些数据(最终读入一个结构中,但目前并不重要),并确保该文件的每行数据量相等。每一行都可以有单词或数字,所以我将文件的一行转换为一个大字符串。然后,我尝试使用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是在其余命令继续执行之前遍历行中的每个字符,还是一旦遇到逗号,我的程序就会进入下一个循环


谢谢大家!

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

在下面的示例中,我假设'\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);
}

不使用
fgets(string,sizeof(string),f)
读入
string
的数据。这是您的意图吗?为什么要同时使用
fgets()
fgetc()
?一种计算行中逗号并在空格中中止的简单方法是迭代该行,类似于:
size\u t commaCount=0;对于(size_t i=0;string[i];i++){if(','==string[i]){commaCount++;}或者if('==string[i]){//abort-due-to-space}
函数:fgets()只在换行或EOF上停止。或者输入缓冲区只剩下一个字节需要填充(由第二个参数定义)。因此fgets()不会停在空格或逗号上(除非输入缓冲区中填充了空格或逗号)。因此,对fgetc()的调用(通常)是从输入文件的下一行获取第一个字符。可能不是你想要的。@user3629249,我不喜欢你的建议的原因是,例如,一行可以有5个逗号,下一行可能有3个。此算法将无法发现一行中没有4个。1)使用
feof()
检查文件结尾是一个非常糟糕的主意,因为它不能像此答案假设的那样工作。2)
fgetc()
返回一个
int
而不是
char
。3) 建议:`int c;而((c=fgetc())!=EOF)