fwrite动态大小

时间:2013-01-18 18:59:24

标签: c curl fwrite

我正在尝试打印由cURL返回的动态下载图像,如下所示:

    char *raw_image = malloc(1024);

    raw_image = doCurl("GET", img_url, NULL, NULL);

    printf("Content-Type: image/png\n\n");

    fwrite(raw_image, sizeof(raw_image), 20000, stdout);

如果我的尺寸小于20000 - 图像会被切断。我怎样才能使这个数字变得动态?我不想写一个文件 - 标准输出是最好的选择。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

[超小型语言无关的评论:你确定将原始PNG数据写入stdout是最好的吗?]

此外,您似乎正在使用libcurl来获取该图片。好吧,如果您没有为CURL句柄设置自定义回调函数,那么它将直接写入stdout。

但是,如果这不是您打算做的,您可能需要查看realloc()

答案 1 :(得分:1)

理想情况下,您需要一种方法来了解正在下载的文件(图像)的大小。

使用libcurl首先获取标题并获取大小。

假设您将尺寸存储在 s

当您分配缓冲区时,请执行

char *raw_image = malloc(s);

因为 s 是您必须保留的数据的大小而不是1024字节!

下载文件并将其存储在 raw_image

然后

fwrite(raw_image, 1, s, stdout);

请注意, sizeof(raw_image)是指向缓冲区的指针的大小,因此在64位hw架构中为8个字节。 这不是文件的大小!

-

但是....

-

你正在提取图像,并在stdout上绘制它。

为什么不对 curl 进行简单的调用?

答案 2 :(得分:0)

你告诉fwrite写一个指针大小的20000个对象。这是因为sizeof(raw_image)返回raw_image的大小,这是一个指针,因此在大多数32位机器上是4个字节,在大多数64位机器上是8个字节。它返回缓冲区raw_image指向的大小。

我不知道如何确定您正在下载的图像的大小,但您需要以某种方式确定该大小。一旦你这样做,你的fwrite调用应该是这样的:

fwrite(raw_image, 1, sizeOfTheImageInBytes, stdout)