我将如何在 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 编译如下,其中3
与filedes
中定义的相同。
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
, stdout
和 stderr
是“文件指针”。
刚刚在我的系统上测试了这个,使用 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C#.Net 中创建原型方法(如 JavaScript)?