我试图从文件中读取一些数据(最终进入结构,但现在不重要)并确保此文件在每一行上具有相同数量的数据。每行可以有单词或数字,所以我已经将一行文件转换成一个大字符串。然后我尝试使用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是否会在其余命令继续之前运行该行中的每个字符,或者一旦遇到逗号,我的程序将在下一个循环中继续运行?
谢谢!
答案 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);
}