open_memstream with fseek to end pad buffer with zero

时间:2014-07-13 16:40:50

标签: c linux fseek

我使用了一些将二进制数据写入文件的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并截断它是否可靠。

1 个答案:

答案 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);