2008-10-29 58 views
2

我使用的fscanf读取其中有像
数行的文件< -whitespace->字符串< -whitespace-> optional_3rd_column制作的fscanf忽略可选参数

我希望提取出每个数字和字符串列,但忽略3rd_column如果它存在

实施例的数据:
12 foo的东西
03巴
24东西#randomcomment

我想提取12,foo; 03,酒吧; 24,而忽略了一些“东西”和“#randomcomment”

我现在有类似

while(scanf("%d %s %*s",&num,&word)>=2) 
{ 
assign stuff 
} 

然而,这并不与任何第三列线工作。我怎样才能让它忽略第二个字符串后的所有内容?

回答

4

在我看来,最简单的解决方案是scanf(“%d%s”,& num,& word),然后fgets()来吃剩下的行。

4

使用fgets()一次读取一行,然后使用sscanf()查找您感兴趣的两列,更健壮,而且您不必执行任何特殊操作来忽略尾随数据。

+0

是的..但我目前正在使用scanf匹配> = 2的项目数来检测文件的有效部分......如果我可以在scanf本身中集成进程,以保持while循环条件不变 – 2008-10-29 04:42:10

+0

我不确定我是否理解,sscanf的工作原理与scanf相同,即它会返回匹配项的数量,因此您可以使用相同的逻辑,即while(fgets(buf ,size,stdin)!= NULL && sscanf(buf,“%d%s”,#,&word)== 2){assign stuff}。 – 2008-10-29 04:51:37

0

我经常使用gets(),然后在字符串上使用sscanf(),呃,gots。

红利:您可以将解析的输入结束测试分开。

10

问题在于%*s在没有第三列时正在吃下一行的数字,然后下一个%d因为下一个令牌不是数字而失败。为了解决这个问题,而无需使用gets()其次sscanf(),您可以使用指定的字符类:

while(scanf("%d %s%*[^\n]", &num, &word) == 2) 
{ 
    assign stuff 
}

[^\n]说那些不是换行,并*抑制赋值,因为之前匹配尽可能多的字符可能。另请注意,您不能在%s%*[\n]之间放置空格,否则格式字符串中的空格将与换行符匹配,导致%*[\n]与整个后续行匹配,这不是您想要的。