2008-10-29 109 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]與整個後續行匹配,這不是您想要的。