我使用一些 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/