我不能让fmemopen一直打印到cstring。做这样的事情:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[256];
FILE *out;
out = fmemopen(buf, strlen(buf), "w");
fprintf(out, "Hello world");
fclose(out);
puts(buf);
return 0;
}
只输出“H”。
我尝试过使用open_memstream
#include <stdio.h>
#include <string.h>
int main(void)
{
char *buf;
int buf_size;
FILE *out;
out = open_memstream(&buf, &buf_size);
fprintf(out, "Hello world");
fflush(out);
puts(buf);
free(buf);
fclose(out);
return 0;
}
这似乎有效,但在其他情况下,似乎是段错误。
如何让fmemopen始终如一地工作和/或我如何忘记从open_memstream返回的指针的值?
编辑:在仔细查看我的代码后,我看到我是如何使用open_memstream获取段错误的。我仍然想知道为什么fmemopen不起作用。答案 0 :(得分:1)
根据您的第一段代码:
调用strlen(buf)
会调用未定义的行为,因为buf
的内容未定义。请改用sizeof(buf)
。
答案 1 :(得分:0)
POSIX组不希望用户为fmemopen
使用二进制模式“ b”。 Glibc删除了此标志。因此,您必须在缓冲区末尾保留1个字节以保留空字符。否则,写操作只会静默失败,您将在当前位置收到此空字符。