Pregunta

Necesito algún consejo sobre cómo revertir el contenido de la entrada estándar.Esta es la parte de mi código que maneja la inversión de la entrada estándar:

int reversestdin(FILE *file)
{
    int a, b;
    int lineas=0;
    while ((a=fgetc(stdin)) !=EOF)
    {
        if (a=='\n')
            lineas++;
    }
    for(b=0; b<lineas; b++)
    { 
        rewind(stdin);
        int d,len, e;
        char str[2048], *ptr;
        for(e=0; e<=b; e++)
        { 
            fgets(str, 2048, stdin);
        }
        ptr=str;
        for(d=0; d<2048; d++)
        {
            if(*ptr=='\n')  break;
            if(*ptr=='\0')  break;
            ptr++;
        }
        len=d;
        ptr--;
        for(d=len; d>0; d--)
        {
            printf("%c", *ptr--);
        }

        printf("\n");
    }
    return 0;
}

También tengo un archivo .txt llamado ejemplo1 con el siguiente contenido:

LINE 1.1
LINE 1.2

LINE 1.4

Este código funciona cuando ejecuto ./myprogram < example1.txt.produce

1.1 ENIL
2.1 ENIL

4.1 ENIL

Pero si ejecuto echo "This text should be reversed" | ./myprogram produce:

(

Eso es todo.Un soporte abierto.Descubrí que si omito la parte de mi código que cuenta líneas y simplemente digo manualmente que hay 1 línea, funciona (para 1 línea, por supuesto).

int reversestdin(FILE *file)
{
    int a, b;
    int lineas=1;
    //while ((a=fgetc(stdin)) !=EOF)
    //{
        //if (a=='\n')
            //lineas++;
    //}
    for(b=0; b<lineas; b++)
    { 
        rewind(stdin);
        int d,len, e;
        char str[2048], *ptr;
        for(e=0; e<=b; e++)
        { 
            fgets(str, 2048, stdin);
        }
        ptr=str;
        for(d=0; d<2048; d++)
        {
            if(*ptr=='\n')  break;
            if(*ptr=='\0')  break;
            ptr++;
        }
        len=d;
        ptr--;
        for(d=len; d>0; d--)
        {
            printf("%c", *ptr--);
        }

        printf("\n");
    }
    return 0;
}

Ahora sale

desrever eb dluohs txet sihT
¿Fue útil?

Solución

Primero, rebobinar stdin no es compatible a menos que (en teoría) haya sido redirigido desde un archivo de entrada.Y como no hay forma (al menos, lo sé) de saber que eso ha sucedido, no te molestes en intentarlo.

Dicho esto, contrariamente a lo que aparentemente es la opinión popular, no es necesario almacenar en buffer toda la entrada.Aún puedes almacenarlo en buffer línea por línea:

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

int main()
{
    int buffer[2048], ch, lines=0, i=0;
    do
    {
        ch = fgetc(stdin);
        if ((ch == '\n') || 
            (ch == EOF && i > 0) || 
            (i == (sizeof(buffer)/sizeof(*buffer)-1)))
        {
            ++lines;
            while (i != 0)
                fputc(buffer[--i], stdout);
            fputc('\n', stdout);
        }
        else
        {
            buffer[i++] = ch;
        }
    } while (ch != EOF);

    return 0;
}

Estoy bastante seguro de que hará lo que estás buscando (o cerca de eso, de todos modos)

Otros consejos

no puedes rebobinar stdin!

Deberías revisar tu lógica para leer hasta EOF en lugar de intentar contar las líneas de antemano.

Otra cosa a tener en cuenta es su declaración que cuenta líneas...

EDITAR:También sugeriría establecer stdin igual a una variable que pueda usar para manipular.Entonces ten algo como temp = stdin por lo que siempre tendrá esa entrada estándar inicial y una temperatura que podrá manipular según sea necesario, y si necesita regresar, todavía tendrá la entrada estándar.

while ((a=fgetc(stdin)) !=EOF)
    {
        if (a=='\n')
            lineas++;
    }

Si lo piensas bien, esa línea que pusiste no tiene un carácter de nueva línea, por lo que tu programa todavía piensa que hay 0 líneas.Así que inicialmente establecería lineas = 1 o si no sabes si habrá algún contenido, puedes verificar si hay algún personaje en él, así que después de un tiempo, o en algún lugar, di if lineas == 0 then check for characters

Otra cosa a considerar es algo llamado Números mágicos.Eso es tu 2048.Buscaría solucionar eso haciendo de 2048 una variable "global".

Flujo sugerido

Usa tu while declaración en lugar de su for declaración.Pero hazlo, while(a != EOF) donde a es un char así que sigue haciéndolo fgetc.Luego simplemente colóquelo en una matriz de caracteres de tamaño 2048 AL FINAL de la matriz, y trabaje hacia atrás (o puede colocarlo en la matriz de caracteres desde 0 hasta la cantidad de caracteres que desee y luego tenga un bucle for que vaya hacia atrás... es decir donde un mostrador sería útil).Pero quieres tener un if a=='\n' luego imprima la línea al revés y restablezca el índice de la matriz a 2048.También sugeriría tener un contador que cuente el número de caracteres para que al retroceder en la matriz no tengas que revisar todo hasta que 2048-counter.

Esto debería ayudarte con un flujo más conciso.Tampoco necesitarás tanto código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top