[英]How to use fscanf properly?
我已經在這段代碼上工作了半天,但仍然無法正常工作。
while(fscanf(file, "%d {", ¯oList[count]) == 1)
{
count++;
}
for(count = 0; count < sizeof macroList/sizeof(macroList[0]); count++)
{
printf("%d ", macroList[count]);
}
我的文件如下所示:
1{ D }2{ D }3{ D }4{ D }5{ D }6{ D }7{ D }8{ D }9{ D }10{ D }11{ D }12{ D }13{ D }14{ D }15{ D }16{ D }17{ D }18{ D }19{ D }20{ D }21{ D }22{ D }23{ D }24{ D }
我的輸出是:
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我希望它像這樣:
1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 23 24
我的問題是,為什么fscanf僅捕獲“第一項”,我該如何解決? 同樣,此fscanf的版本將捕獲整數和左括號之間的任何空白,將不勝感激。 我有這個
while(fscanf(file, "%d %[^{]{", ¯oList[count]) == 2)
但輸出是相同的。
任何幫助表示贊賞,謝謝。
我希望格式不要太混亂,第一次使用它。
編輯:我忘了提一下,盡管文件完全像這樣,但對我不起作用,該文件的實際格式將類似於1{ D,DL,L }2{ _D W52 ^DL. 123 }
1{ D,DL,L }2{ _D W52 ^DL. 123 }
。 因此,括號內幾乎可以包含任何數量的任何內容。
更改
fscanf(file, "%d {", ¯oList [count])
至
fscanf(file, "%d {%*[^}]}", ¯oList [count])
在這里, %d
掃描一個int
並將其存儲在macroList[count]
的地址中,然后格式字符串中的空格期望任何數量的空格字符(空格,換行符等),包括無。 然后, fscanf
掃描{
,然后掃描並丟棄所有內容,直到找到}
( %[^}]
),最后掃描}
。
您的代碼除了第一次迭代外沒有任何作用,因為"%d {"
首先需要一個int
,然后是任意數量的空格字符,包括無空白字符和左括號( {
)。 對於第一次運行,這是可以的,但對於其余的迭代而言,這是沒有問題的,因為要掃描的下一個對象是" D }"
並且這與格式字符串"%d {"
匹配。
請注意,如果{
和}
之間沒有任何內容,則上述從文件中提取數據的方法將失敗(第一次迭代除外)。 因此,請在以下注釋中使用@chux建議的內容 :
fscanf(file, "%d {%*[^}]" ,¯oList [count]);
fscanf(file, "}");
當您使用"%d {"
,您將讀取一個int
,然后一個空格和一個開頭backet。 這就是為什么您的第一個輸出正確的原因。 之后,將使用相同的命令來繼續讀取文件,但是現在要讀取的字符串為" D }"
,即空格,大寫字母“ D”和右括號,決不是您真正想要的。
在fscanf
使用"%d { D }"
來解決問題,因為這恰好是重復模式:它將讀取一個int
,一個空格,一個左括號,另一個空格,一個'D',最后一個空格,然后右括號。 另外,請記住正確使用fopen
和fclose
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.