Cómo imprimir tanto en stdout como en archivo en C

Leí este tema, pero su problema puede ser diferente al míoEscribiendo tanto en stdout como en un archivo

Quiero escribir una función, esa función debe imprimirse tanto en stdout como en un archivo. Mi programa C obtiene la entrada del usuario por scanf.

Tengo la intención de escribir una función como printf pero realmente no sé cómo:

He intentado esto, pero solo puede funcionar con una cadena "pura", no puede convertir% d,%. * Lf (mi función de impresión solo necesita dos conversiones)

void dupPrint(FILE *fp,char *string)
{
    printf("%s",string);
    fprintf(fp,"%s",string);

    return;
}

ntenté dup2 y freopen pero no funcionaron para mí.

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
    int i;
    int file = open("input3.txt", O_APPEND | O_WRONLY);
    if(file < 0) return 1;

    if(dup2(file,1) < 0) return 1;

    printf("Redirect to file!\n");
    printf("enter i : ");
    scanf("%d",&i);



    return 0;
}

Este tutorial dup2 () solo se imprime en un archivo.

Traté también de tee, pero puede que no funcione porque tengo que recibir información del usuario (si funciona, no es "justo" porque tee no está en mi programa).

Creo que implementar un problema similar a printf resolverá el problema, pero no sé cómo convertirlo. * Lf (imprimir doble con precisión de ingreso del usuario)

#include <stdio.h>
#include <stdarg.h>
void dupPrint(FILE *fp,char *fmt,  ...)
{
    va_list ap;
    char *p, *sval;
    int ival;
    double dval;

    va_start (ap, fmt); //make ap point to 1st unnamed arg
    for(p = fmt; *p; p++)
       {
           if (*p != '%') {
               putchar(*p);
               continue;
           }
           switch (*++p) {
               case 'd':
                   ival = va_arg(ap, int);
                   printf("%d", ival);
                   break;
               case '.*lf' //?????
           }
       }       

}

¿Alguien puede sugerir una solución para mi problema?

Respuestas a la pregunta(4)

Su respuesta a la pregunta