gpt4 book ai didi

c - 带有 fseek 的 open_memstream 以用零结束填充缓冲区

转载 作者:行者123 更新时间:2023-12-03 09:53:16 32 4
gpt4 key购买 nike

我使用一些 C 代码将二进制数据写入文件。在此过程中,它会四处寻找不同的位置,然后最终使用 fseeko(fp, 0, SEEK_END); 寻找结束。

但是,在某些情况下,我想改为处理内存中的流。为此,我使用了 open_memstream,但是寻找到最后用零填充缓冲区,最终它的大小是它应该的两倍。

下面的示例只是为了演示 fseek 到流末尾的效果。在实际代码中,我们还 fseek 到流的不同部分,在处理流时修补和编辑它的位等。另请注意,将文件末尾写入文件系统只是为了演示以显示缓冲区的内容——否则我不需要内存流。

#include <stdio.h>
#include <stdlib.h>

#if (defined(BSD) || __APPLE__)
#include "open_memstream.h"
#endif

int main(void) {
FILE *stream;
FILE *outfile;
char *buf;
size_t buf_len;
int i;

stream = open_memstream(&buf, &buf_len);

for(i = 0; i < 1000; i++) {
fprintf(stream, "%d\n", i);
}

fseeko(stream, 0, SEEK_END);

fclose(stream);

outfile = fopen("out.txt", "w");
fwrite(buf, buf_len, 1, outfile);
fclose(outfile);

return 0;
}

我在 Mac OS X 上使用 this 对此进行了测试open_memstream 的实现,它按我预期的方式工作,但是当我在 Linux 上运行它时,文件大小是原来的两倍,末尾为零。

处理此问题的最佳方法是什么?我不确定将缓冲区长度除以二并截断它是否可靠。

最佳答案

我刚刚在 Linux 上遇到了同样的问题。

// It seams that SEEK_END does not work with open_memstream()
fseek(stream, 0, SEEK_END);

我最终这样做了:

off_t o = ftell(stream);
/* do some things with the stream */
fseek(stream, o, SEEK_SET);

关于c - 带有 fseek 的 open_memstream 以用零结束填充缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724939/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com