2010-07-23 19 views
2

我寫了一個快速內存讀取器類,模擬與freadfscanf相同的功能。如何獲取sscanf_s在最後一次操作中讀取的字節數?

基本上,我用memcpy並增加了一個內部指針來讀取數據,如fread,但我有一個fscanf_s調用。我用sscanf_s,除了不告訴我它從數據中讀出多少字節。

有沒有辦法告訴在最後一個操作中讀取了多少個字節sscanf_s以增加字符串讀取器的內部指針?謝謝!

編輯:

而且格式示例我正在讀: |172|44|40|128|32|28|

的fscanf讀取很好,所以做的sscanf。唯一的理由是,如果它是:

|0|0|0|0|0|0|

長度會有所不同。我想知道的是,fscanf知道如何放置文件指針,但sscanf不知道。

+0

(編輯後)我想你需要'%n' – Abel 2010-07-23 17:33:39

+0

可能重複[獲取sscanf讀取的字符數?](http://stackoverflow.com/questions/13503135/get-number-of-characters -read-by-sscanf) – sevko 2015-07-10 18:13:01

回答

2

也許我很愚蠢,但我要去試試。從評論主題看來,仍然存在一些誤解。你需要知道字節的數量。但該方法僅返回讀取的字段數量或EOF。

要獲得大小的字節,請使用您可以輕鬆計數的內容,或者在格式字符串中使用大小說明符。否則,你不會有機會找出有多少字節被讀取,然後逐個遍歷字段。此外,您可能的意思是,

sscanf_s(source, "%d%d"...) 

將成功在兩個輸入「123 456」和「10 \ t30」,它有不同的長度。在這些情況下,除非您將其轉換回來,否則無法確定尺寸。所以:使用一個固定大小的字段,或遺忘...

重要提示:請記住,使用%c時,它是在輸出中包含字段分隔符(換行符,製表符和空格)的唯一方法。所有其他人將跳過字段邊界,使得難以找到合適的字節數。

編輯:
從 「C++的完整參考」 我剛讀:

%n  接收一個整數值等於 字符的數量相等讀到目前爲止

這不正是你所追求的嗎?只需將其添加到格式字符串中即可。這是confirmed here,但我沒有用sscanf_s測試它。

+0

接受您的編輯,測試和完美工作。我接受你的,因爲我知道你是第一個回答這個問題的。再次感謝! – Gbps 2010-07-23 17:34:48

+0

@Gbps:不客氣,這次沒有upvotes? ;-)。 PS,如果有人錯過了,請參考相同的'%n1'的MSDN參考http://msdn.microsoft.com/zh-cn/library/6ttkkkhh%28v=VS.80%29.aspx – Abel 2010-07-23 17:37:16

0

From MSDN:

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l 

這些函數返回成功轉換和指定字段的數目;返回值不包括已讀但未分配的字段。返回值爲0表示未分配字段。返回值是錯誤的EOF,或者是否在第一次轉換之前到達字符串的末尾。

+0

但是,如果您正在閱讀%d,%d,%d?這些數字中的每一個都是字符串形式,沒有說明符。 – Gbps 2010-07-23 17:08:15

+0

如果你想精確的話,使用char數組,如'char * buffer = new char [80];'指定大小:'sscanf_s(anysource,「%s」,buffer,80);'。從這裏開始:http://www.gamedev.net/community/forums/topic.asp?topic_id=393967 – Abel 2010-07-23 17:10:03

+0

這是一些領域!問題要求「字節數」。 – Patrick 2010-07-23 17:10:42

6

scanf和系列,在格式字符串中使用%n。它不會讀取任何內容,但會導致到目前爲止(通過此調用)讀取的字符數存儲在相應的參數中(預計爲int*)。

相關問題