0
我正在關閉一塊硬件,我想加載一個文本文件。我只有下面的函數來訪問輔助存儲器:scanf從數據緩衝區在C/C++
bool load_file(const char *filename, int **buf, int *size)
這意味着我將結束與buf中的所有數據和它的尺寸大小。我怎樣才能從中提取字符串,整數或浮點數據?我想以類似的理由來使用scanf。
謝謝。
我正在關閉一塊硬件,我想加載一個文本文件。我只有下面的函數來訪問輔助存儲器:scanf從數據緩衝區在C/C++
bool load_file(const char *filename, int **buf, int *size)
這意味着我將結束與buf中的所有數據和它的尺寸大小。我怎樣才能從中提取字符串,整數或浮點數據?我想以類似的理由來使用scanf。
謝謝。
您可以使用sscanf
來掃描內存塊而不是文件,類似於您可以使用sprintf
到printf
的方式進入內存。原型爲:
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.
它取決於如何在'buf'中佈置數據。 – Nim
很大程度上取決於它是如何填充的。 'int ** buf'不直接指示文本流。 –
有sscanf,但你必須將字節數組轉換爲char數組。 – BigMike