发送文件写入内存缓冲区(fopen something,但写入缓冲区,而不是磁盘)

时间:2012-03-06 20:18:25

标签: c ios

我想:

  1. 重定向stdout / stderr
  2. 到内存缓冲区,而不是磁盘
  3. 让stdout / err正常运行
  4. 我知道如何使用dup2和freopen:

    • 将stdout / err重定向到我选择的文件
    • 让stdout / err正常运行

    ......但我不确定第2项?

    原因:我想将数据转发到stdout / err(来自第三方代码),然后将其发送到网络服务器 - 同时让应用程序正常运行。

    为什么? ...因为现在当我们的应用程序运行时,我们看到关键数据从第三方代码转到stdout(和错误),并且它是一个让用户尝试使用本地日志文件的PITA。我宁愿将“最后N个字节”捕获到环形缓冲区中,对其进行后处理,然后 - 如果用户报告存在问题 - 将其发送到服务器。

    为什么要避免文件? ...因为这是针对必须在iOS和桌面上运行的代码,并且“不断写入文件”是我想要避免的,因为我不想将它作为文件。另外......我不得不担心维护该文件,主动修剪其大小等等。

1 个答案:

答案 0 :(得分:4)

Stdout是一个基本的文件句柄,这意味着它是一个指针。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv);

int main (argc,argv)
int argc;
char **argv;
{
    stdout = &(*stderr);
    fprintf(stdout, "test");
    return 0;
}

通过声明stdout指向不同的文件句柄,该程序重定向stdout。要对其进行测试,请将其编译为test,然后在命令行上键入./test > t./test 2> t

重定向的stdout管道仍将输出单词test,而重定向的stderr管道则不会。

由于文件是流,请阅读此section of the GNU C Library以了解如何创建内存流。此示例创建一个文本缓冲区以动态调整大小以保存输入,并将stdout重定向到指向它。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv);

int main (argc,argv)
int argc;
char **argv;
{
    char *bp;
    size_t size;
    FILE *stream;

    stream = open_memstream (&bp, &size);
    stdout = &(*stream);
    fprintf(stdout, "test");
    fflush(stdout);
    fprintf(stderr, "buf = %s, size = %d\n", bp, size);
    fclose (stream);
    free(bp);
    return 0;
}

在手册中切换输入和输出时,请注意有关冲洗缓冲区的部分。