我正在阅读一个文件,在读完一个数字之后,我想跳过剩下的那一行。这个文件的一个例子是
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");
我原本希望这会读到新行的所有内容,然后再阅读新行。我不需要内容,所以我使用*运算符。但是,当我使用此命令时,没有任何反应。光标不会移动。
答案 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 */
}
}
您可能希望根据文件中的行格式更改num
中line
的读取方式。但在你的情况下,似乎整数位于第一位或根本不存在。所以上面的工作正常。
答案 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”,这意味着跳过除行尾之外的任何内容,然后跳过行尾。