我将如何在 c 中创建一个输出流,如 stdout?

Posted

技术标签:

【中文标题】我将如何在 c 中创建一个输出流,如 stdout?【英文标题】:how would i create a file output stream in c like stdout? 【发布时间】:2012-01-07 12:03:48 【问题描述】:

如果 printf 使用标准输出,但我将如何使用自己的输出流编写打印函数?我想用类似 OO 的结构来处理这个流,但我可以自己做。这可能吗?这个学习了。

类似这样的工作 - 我没有测试这段代码:

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

FILE* stdout2 = NULL;

int init() 
    stdout2 = fopen("stdout.txt", "w");
    if (!stdout2) return -1;
    return 1;


void print(char* fmt, ...) 
    va_list fmt_args;
    va_start(fmt_args, fmt);
    char buffer[300];
    vsprintf(buffer, fmt, fmt_args);
    fprintf(stdout2, buffer);
    fflush(stdout2);


void close() 
    fclose(stdout2);


int main(int argc, char** argv) 
    init();
    print("hi"); // to console?
    close();
    return 0;

如何将 printf(char*, ...) 打印到控制台?我必须在同一个函数中读取文件吗?

【问题讨论】:

你的问题有点令人困惑......你的代码虽然丑陋:-),但它的工作原理很好。我强烈建议在返回 int 类型(而不是 1)的函数成功时返回 0 ...你想用 print("hi") 做什么?你想把它打印到控制台和文件吗?如果是这样,那可以比你正在做的更有效。 【参考方案1】:

尝试使用fdopen(参见The GNU C Library: Descriptors and Streams)。

#include <stdio.h>

int main(void) 

  int filedes = 3; // New descriptor
  FILE *stream = fdopen (filedes, "w");
  fprintf (stream, "hello, world!\n");
  fprintf (stream, "goodbye, world!\n");
  fclose (stream);

  return 0;

使用 gcc 编译如下,其中3filedes 中定义的相同。

gcc -o teststream teststream.c && ./teststream 3> afile.txt && cat afile.txt

结果:

hello, world!
goodbye, world!

【讨论】:

【参考方案2】:

您可以使用fprintf 写入文件*,这将具有与 printf 相同的语义。

int main(int argc, char** argv) 
    init();
    fprintf(stdout2,"hi"); // will print to file
    close();
    return 0;

【讨论】:

【参考方案3】:

如果在init 中,您将stdout 分配给您自己的变量,则输出将发送到控制台

void init() 
    stdout2 = stdout;
    if (!stdout2) return -1;
    return 1;

【讨论】:

stdout 通常是 #defined 到 fd 编号:0 意味着你必须先 fdopen @chacham15:参见C99 Standard 中的 7.16.1/3。 stdout 是“pointer to FILE 类型的表达式”;没有关于它是宏的参考或对“fd”甚至“文件描述符”的参考 啊,我习惯pre c90标准(通常是为了便携性) @chacham15:你在想STDOUT_FILENO,它总是被定义为0。除了K&R第一版之外,没有 c90之前的标准,其中stdin , stdoutstderr 是“文件指针”。 刚刚在我的系统上测试了这个,使用 gcc3 和 cygwin stdout 是#defined to 0【参考方案4】:

这基本上是正确的。您应该使用使用长度参数的函数,但出于安全/溢出目的。其次,控制台(即stdout)只是一个id为0,stderr为1的文件描述符。你可以用fdopen打开文件描述符


int main()
    stdout2 = fdopen(stdout, "w");
    print("Hello World"); //This will print to console
    return 0;


【讨论】:

好的,我明白,但是当我使用打印功能时,它会转到一个很好的文件,但是 printf 是否使用另一个文件(如标准输入)将它放在控制台上? fdopen 返回一个 FILE* 参见:mkssoftware.com/docs/man3/fdopen.3.asp。这意味着您可以使用 FILE* 写入控制台。如果你问 printf 本身是如何实现的,我相信它使用了 putchar 这样的基本功能

以上是关于我将如何在 c 中创建一个输出流,如 stdout?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中创建广播流

如何在 C#.Net 中创建原型方法(如 JavaScript)?

在 React 中创建一个保存数据的表单

C之IO流

急!使用freopen后如何将stdout输出流还原回屏幕?

如何在eclipse中创建一个servlet程序