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

标签 c ios

我愿意:

  1. 重定向标准输出/标准错误
  2. 到内存缓冲区,而不是磁盘
  3. 同时让 stdout/err 正常运行

我知道如何使用 dup2 和 freopen 来:

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

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

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

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

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

最佳答案

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了解如何创建内存流。此示例创建一个文本缓冲区以动态调整大小以保存输入,并重定向标准输出以指向它。

#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;
}

请注意手册中有关在输入和输出之间切换时刷新缓冲区的部分。

关于c - 将文件写入内存缓冲区(fopen something,但写入缓冲区,而不是磁盘),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591196/

相关文章:

c - 在 C 中快速打印出大量整数

ios - 从 SQLite 检索行花费太多时间

C - 计数器不工作

C Unix - 解析单行字符

c - fprintf() 和 fread() 在 .txt 文件中的用法

iphone - 如何在UIImageView中显示eps格式图片

ios - Xcode 警告 : Ignoring file libxml2. 2.dylib,为不受支持的文件格式构建,这不是被链接的体系结构

iphone - 对象在 iOS 5 ARC 中发布得太早

ios - Meteor Cordova 图标和启动画面未显示

c - 如何将 float 舍入为 int?