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

标签 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 上使用 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/

相关文章:

c - 增加 ARM i.MX287 上的 Linux DMA_ZONE 内存

在 Windows 上的所有环回接口(interface)上创建双栈套接字

mysql - 无法创建表(错误号 :121) when importing mysql workbench export dump only on Linux

linux - PHP -v 命令根据我当前的目录给出不同的结果

c++ - fgets() 似乎没有正确移动文件指针

c - fseek 一个新创建的文件

将莫尔斯字符串转换为字符数组

linux - 麦克风输入的当前电平

c - 使用 fseek() 查找用户输入的位置

c - 如何制作一个简单的谓词引擎