忽略2个字符之间的字符

时间:2012-02-24 22:00:25

标签: c

我正在查看文件。如果我遇到'#'我想忽略一切,直到我''n' 。我目前的逻辑不起作用。

我试图从文件中删除评论 我认为这个问题与我在第二个while循环中的逻辑有关

int wishforint(FILE *in)
{
char c;
int d;
int i=0;
int smarr[5];

while(i<5)
{
   fscanf(in, "%c", &c);
   printf("c is %c\n",c);

   if(isdigit(c))
   {
      ungetc(c, in);
      fscanf(in, "%d", &d);
/*add this later. 
return d;
*/
      smarr[i]=d;
      printf("smarr[%d]= %d\n",i,d);
      i++;
   }
   else if(c=='#')
   {
      while(fscanf(in,"%c",&c) != EOF && c != '\n')
      {}
      break;
   }
}


   printf("Width is = %d\n", smarr[1]);
   printf("Height is= %d\n", smarr[2]);
   printf("Max value= %d\n", smarr[3]);

   return 7;
}

3 个答案:

答案 0 :(得分:4)

'#'不是数字,因此您可能会在continue之前点击else if

答案 1 :(得分:1)

代码有两个问题。

首先fscanf不检查EOF。修正:


    //fscanf(in, "%c", &c);
    if (fscanf(in, "%c", &c) == EOF) { break; }

其次,“#”条款中不应该有“中断”:


    else if(c=='#')
    {
      while(fscanf(in,"%c",&c) != EOF && c != '\n')
      {}
      //break;
    }

答案 2 :(得分:0)

可能会更容易使用sscanf和fgets吗?

可能是这样的:

while (fgets(buf, BUF_LENGTH, in) != NULL){
    errno=0;
    if ((sscanf(buf, "%d", &d) == 0) && (errno == 0)){
      //we have a comment
      continue;
    }else if(errno != 0){
      //error handling
    }
    //we have a value
    smarr[i]=d;
    i++;
}

它应该适用于单值列表文件。评论从新行开始或价值之后开始。

您能否展示输入数据的示例?