我将如何在像stdout这样的c中创建输出流?

时间:2011-11-27 20:49:01

标签: c stream io streaming stdout

如果printf使用stdout,但我如何使用自己的输出流编写打印功能?我想用类似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 *,...)打印到控制台?我必须在同一个函数中读取文件吗?

4 个答案:

答案 0 :(得分:6)

尝试使用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!

答案 1 :(得分:0)

您可以使用fprintf写入FILE *,其语义与printf相同。

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

答案 2 :(得分:0)

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


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

答案 3 :(得分:0)

如果在init内,您将stdout分配给您自己的变量,则输出将显示在控制台

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