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