Как бы я создать выходной поток в C, как стандартный вывод? - PullRequest
5 голосов
/ 28 ноября 2011

если printf использует stdout, но как мне написать функцию печати, используя мой собственный поток вывода? я хочу обработать этот поток с ОО-подобной структурой, но я могу сделать это сам. Это возможно? это для обучения.

хотел бы что-то подобное - я не тестировал этот код:

#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 ]

6 голосов
/ 28 июля 2016

Попробуйте использовать fdopen (см. Библиотека GNU C: дескрипторы и потоки ).

#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!
0 голосов
/ 28 ноября 2011

Это в основном правильно.Вы должны использовать функции, которые используют параметры длины, хотя в целях безопасности / переполнения.Во-вторых, консоль (т.е. stdout) - это просто файловый дескриптор с идентификатором 0, stderr - 1. Вы можете открыть файловые дескрипторы с помощью fdopen


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

0 голосов
/ 28 ноября 2011

Если внутри init вы назначите stdout для своей собственной переменной, вывод будет на консоль

void init() {
    stdout2 = stdout;
    if (!stdout2) return -1;
    return 1;
}
0 голосов
/ 28 ноября 2011

Вы можете писать в FILE * с помощью fprintf , который будет иметь ту же семантику, что и printf.

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