簡體   English   中英

如何正確使用fscanf?

[英]How to use fscanf properly?

我已經在這段代碼上工作了半天,但仍然無法正常工作。

while(fscanf(file, "%d {", &macroList[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 %[^{]{", &macroList[count]) == 2)

但輸出是相同的。

任何幫助表示贊賞,謝謝。

我希望格式不要太混亂,第一次使用它。

編輯:我忘了提一下,盡管文件完全像這樣,但對我不起作用,該文件的實際格式將類似於1{ D,DL,L }2{ _D W52 ^DL. 123 } 1{ D,DL,L }2{ _D W52 ^DL. 123 } 因此,括號內幾乎可以包含任何數量的任何內容。

更改

fscanf(file, "%d {", &macroList [count])

fscanf(file, "%d {%*[^}]}", &macroList [count])

在這里, %d掃描一個int並將其存儲在macroList[count]的地址中,然后格式字符串中的空格期望任何數量的空格字符(空格,換行符等),包括無。 然后, fscanf掃描{ ,然后掃描並丟棄所有內容,直到找到}%[^}] ),最后掃描}

您的代碼除了第一次迭代外沒有任何作用,因為"%d {"首先需要一個int ,然后是任意數量的空格字符,包括無空白字符和左括號( { )。 對於第一次運行,這是可以的,但對於其余的迭代而言,這是沒有問題的,因為要掃描的下一個對象是" D }"並且這與格式字符串"%d {"匹配。

請注意,如果{}之間沒有任何內容,則上述從文件中提取數據的方法將失敗(第一次迭代除外)。 因此,請在以下注釋中使用@chux建議的內容

fscanf(file, "%d {%*[^}]" ,&macroList [count]);
fscanf(file, "}");

當您使用"%d {" ,您將讀取一個int ,然后一個空格和一個開頭backet。 這就是為什么您的第一個輸出正確的原因。 之后,將使用相同的命令來繼續讀取文件,但是現在要讀取的字符串為" D }" ,即空格,大寫字母“ D”和右括號,決不是您真正想要的。

fscanf使用"%d { D }"來解決問題,因為這恰好是重復模式:它將讀取一個int ,一個空格,一個左括號,另一個空格,一個'D',最后一個空格,然后右括號。 另外,請記住正確使用fopenfclose函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM