2011-10-20 127 views
0

我正在關閉一塊硬件,我想加載一個文本文件。我只有下面的函數來訪問輔助存儲器:scanf從數據緩衝區在C/C++

bool load_file(const char *filename, int **buf, int *size) 

這意味着我將結束與buf中的所有數據和它的尺寸大小。我怎樣才能從中提取字符串,整數或浮點數據?我想以類似的理由來使用scanf。

謝謝。

+0

它取決於如何在'buf'中佈置數據。 – Nim

+3

很大程度上取決於它是如何填充的。 'int ** buf'不直接指示文本流。 –

+1

有sscanf,但你必須將字節數組轉換爲char數組。 – BigMike

回答

4

您可以使用sscanf來掃描內存塊而不是文件,類似於您可以使用sprintfprintf的方式進入內存。原型爲:

int sscanf (const char *str, const char *format, ...); 

換言之,相同scanf但具有指針添加。

這是爲了將字符數據轉換爲其他類型。如果您在該內存緩衝區中有原始數據,則可以投射和取消引用。

換句話說,假定有與開始在第五位置的整數的存儲器緩衝器(偏移4),是這樣的:

#include <stdio.h> 
int main(void) { 
    //    +--------------+--> little-endian, 
    //    |    |  32-bit = 42. 
    char xyz[] = "1234\x2a\x00\x00\x00"; 
    int x = *((int*)(xyz+4)); 
    printf ("%d\n", x); 
    return 0; 
} 

假設你的整數編碼是相同的礦井,這個輸出42 (十六進制2A)。一次取下一個表達式:

 
     (xyz+4) : Get the address four unit past xyz. Since xyz is a char 
        pointer, this means four bytes. 
    (int*)(xyz+4) : Cast it into an int pointer. 
*((int*)(xyz+4)) : De-reference that to get the int at that address.