【问题标题】:Redirect stdout C file stream to buffer将标准输出 C 文件流重定向到缓冲区
【发布时间】:2014-02-18 06:06:26
【问题描述】:

有什么方法可以将 stdout 文件流(C 标准输出)重定向到 Windows 中的缓冲区?

唯一对我有用的是:

FILE *fp = freopen("output.txt", "w", stdout);
printf("Hello\n");
fclose(fp);

但我总是必须读回文件才能获取缓冲区内容。有什么方法可以直接将其重定向到内存缓冲区?

【问题讨论】:

  • 必须是 C 代码吗?否则,只需在启动程序时使用 > 重定向
  • 是的,不幸的是在代码中。
  • 我想直接将 stdout 重定向到一个 char 数组中,而不是将其写入文件然后将其读入 char 数组。
  • 您可以将所有printfs 替换为myprintf,其中myprintf 是类似于fprintf 的函数,但会将输出写入缓冲区。 myprintf 本质上会使用 vsprintf 将输出放入 char 缓冲区,然后再放入您的内存缓冲区。
  • 假设您的输出不会变得太大,您可以使用 setvbuf() 启用完全缓冲到保证足够大以容纳所有输出的缓冲区。确保永远不要调用 fflush()。不过,您可能会遇到实现定义的最大缓冲区大小。

标签: c windows stdout


【解决方案1】:

您可以将所有printfs 替换为myprintf,其中myprintf 是类似于fprintf 的函数,但会将输出写入缓冲区。 myprintf 本质上会使用 vsprintf 将输出放入 char 缓冲区,然后再到您的内存缓冲区。

这里是这个概念的一个非常简单和天真的实现,没有错误检查只是为了给你一个想法。

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

void myprintf(char *mybuffer, const char *format, ...)
{
  va_list args;
  va_start (args, format);

  char tempbuffer[100] ;
  vsprintf (tempbuffer, format, args);

  strcat(mybuffer, tempbuffer) ;
  va_end (args);
}

int main()
{
  char buffer[100] ;
  buffer[0] = 0 ;

  myprintf (buffer, "Hello world!\n") ;
  myprintf (buffer, "Hello %s %d", "world", 123) ;

  printf (buffer) ; 
  return 0 ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多