3

我正在读取一个文件,在读取一个数字后,我想跳到该行的剩余部分。文件的一个例子是这个

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");

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

4

3 回答 3

12

我建议您使用fgets()然后sscanf()来读取数字。scanf() 函数容易出错,您很容易将格式字符串弄错,这似乎适用于大多数情况,而在某些情况下,当您发现它无法处理某些特定输入格式时,它会意外失败。

快速搜索 SO 上的scanf() 问题将显示人们在使用 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 */
   }
}

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

于 2013-07-29T19:10:57.047 回答
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;
}
于 2013-07-29T18:54:45.097 回答
0

我想解析 /proc/self/maps 文件,但只想要前 2 列(地址范围的开始和结束)。这适用于 Linux gcc。

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

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

于 2020-11-09T17:43:42.827 回答