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