我使用了一些将二进制数据写入文件的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上对open_memstream
实施{{1}}进行了测试,它按预期工作,但是当我在Linux上运行时,文件的大小是最后的两倍,最后是零
最好的解决方法是什么?我不确定将缓冲区长度除以2并截断它是否可靠。
答案 0 :(得分:0)
我刚刚在 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);