在C语言中,将数据写入字符串而不是文件的函数是fwrite。

4

我正在编写一个C程序,从相机中获取JPEG帧并进行各种处理。我有以下函数:

static void process_frame(const void *p, int size) {
        fwrite(p, size, 1, stdout);
}

这段代码在向标准输出流中写入时表现良好,但我真正需要的是像下面这样的函数("swrite"类似于fwrite,但是将数据写入一个char数组而不是文件):

static char* process_frame(const void *p, int size) {
        char* jpegframe;
        swrite(p, size, 1, jpegframe);
        return jpegframe;
}

很不幸,没有swrite函数(至少我没有找到)。

那么...

有没有类似于“swrite”函数的功能?

或者

如何使用process_frame函数与printf(因此与sprintf)而不是fwrite一起使用?


4
malloc和memcpy有什么问题? - hyde
1
你知道sprintf吗?虽然文本导向的函数在二进制文件操作中没有对应物(据我所知),但它是fprintf的等效用法。 - Weather Vane
在这里,使用memcpymemmove,并适当分配目标缓冲区,是正确的方法... - twalberg
2个回答

8
一个 char 只是一个单独的字符。你想要的是一个 char 缓冲区;而且,你的 p 已经是一个了。只需使用 (char*)p(将你的 void 指针转换为 char 指针),或者将 p 指向的内容复制到你选择的 char 缓冲区中,使用 memcpy
Deamentiaemundi 提出了一个很好的观点:你可能以某种原因将 p 作为 const void* 传递;如果你打算修改数据,那么一定要使用 memcpy 复制内容。

2
const void * 强制转换为非 const 指针可能会反噬。我认为你使用 memcpy 的解决方案更好。 - deamentiaemundi

6

在内部,你的指针 p 似乎只是一个大字节数组。你可以将其强制转换为 char 数组并使用:

char *jpegframe = (char *) p;

如果您想修改框架,您可能需要分配更多的内存并将其复制:

static char* process_frame(const void *p, int size) {
    char* jpegframe = malloc(size);
    memcpy(jpegframe, p, size);

    /* Do the processing... */

    return jpegframe;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接