使用C中的fscanf跳过行的剩余部分

时间:2013-07-29 18:46:53

标签: c scanf

我正在阅读一个文件,在读完一个数字之后,我想跳过剩下的那一行。这个文件的一个例子是

2 This part should be skipped
10 and also this should be skipped
other part of the file

目前我通过使用此循环解决了这个问题:

char c = '\0';
while(c!='\n') fscanf(f, "%c", &c);
然而,我想知道是否有更好的方法来做到这一点。我尝试了这个,但由于某种原因,它无法正常工作:

fscanf(f, "%*[^\n]%*c");

我原本希望这会读到新行的所有内容,然后再阅读新行。我不需要内容,所以我使用*运算符。但是,当我使用此命令时,没有任何反应。光标不会移动。

3 个答案:

答案 0 :(得分:12)

我建议您使用fgets()然后 sscanf() 来阅读该号码。 scanf()函数容易出错,你很容易得到格式字符串错误,这似乎适用于大多数情况,并且当你发现它不能处理某些特定的输入格式时会出现意外故障。

在SO上快速搜索 scanf() problems 会显示人们在使用scanf()时出错的频率并遇到问题。

相反,fgets()+ sscanf()给出了更好的控制权,你知道你已经读过一行,你可以处理你读过的行读取整数:

char line[1024];


while(fgets(line, sizeof line, fp) ) {

   if( sscanf(line, "%d", &num) == 1 ) 
   {
    /* number found at the beginning */
   }
   else
   {
    /* Any message you want to show if number not found and 
     move on the next line */
   }
}

您可能希望根据文件中的行格式更改numline的读取方式。但在你的情况下,似乎整数位于第一位或根本不存在。所以上面的工作正常。

答案 1 :(得分:1)

#include <stdio.h>

int main(){
    FILE *f = fopen("data.txt", "r");
    int n, stat;
    do{
        if(1==(stat=fscanf(f, "%d", &n))){
            printf("n=%d\n", n);
        }
    }while(EOF!=fscanf(f, "%*[^\n]"));
    fclose(f);

    return 0;
}

答案 2 :(得分:0)

我想解析/ proc / self / maps文件,但只希望前两列(地址范围的开始和结束)。这在Linux gcc上效果很好。

scanf(“%llx-%llx%* [^ \ n] \ n”,&i,&e);

诀窍是“%* [^ \ n] \ n”,这意味着跳过除行尾之外的任何内容,然后跳过行尾。