2011-10-20 84 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.