Question

J'ai besoin de conseils sur la façon d'inverser le contenu de stdin.C'est la partie de mon code qui gère l'inversion de stdin :

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;
}

J'ai également un fichier .txt appelé exemple1 avec le contenu suivant :

LINE 1.1
LINE 1.2

LINE 1.4

Ce code fonctionne lorsque j'exécute ./myprogram < example1.txt.Il produit

1.1 ENIL
2.1 ENIL

4.1 ENIL

Mais si j'exécute echo "This text should be reversed" | ./myprogram il produit :

(

C'est ça.Un support ouvert.J'ai découvert que si j'omets la partie de mon code qui compte les lignes et que je dis simplement manuellement qu'il y a 1 ligne, cela fonctionne (pour 1 ligne bien sûr).

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;
}

Il produit maintenant

desrever eb dluohs txet sihT
Était-ce utile?

La solution

Tout d'abord, rembobiner stdin n'est pas pris en charge à moins (en théorie) qu'il ait été redirigé depuis un fichier d'entrée.Et comme il n'y a aucun moyen (à ma connaissance, en tout cas) de savoir ce qui s'est produit, ne vous embêtez pas à l'essayer.

Cela dit, contrairement à ce qui semble être l’opinion populaire, vous n’êtes pas obligé de mettre en mémoire tampon l’intégralité de l’entrée.Vous pouvez toujours le mettre en mémoire tampon ligne par ligne :

#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;
}

Je suis presque sûr que cela fera ce que vous recherchez (ou presque, en tout cas)

Autres conseils

Tu ne peux pas rembobiner stdin!

Vous devriez réviser votre logique pour lire jusqu'à ce que EOF au lieu d'essayer de compter les lignes à l'avance.

Une autre chose à regarder est votre déclaration qui compte les lignes...

MODIFIER:Je suggérerais également de définir stdin égal à une variable que vous pouvez utiliser pour manipuler.Alors ayez quelque chose comme temp = stdin vous aurez donc toujours ce stdin initial et cette température que vous pourrez manipuler selon vos besoins, et si vous devez revenir en arrière, vous avez toujours stdin.

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

Si vous y réfléchissez, la ligne que vous avez insérée n'a pas de caractère de nouvelle ligne, donc votre programme pense toujours qu'il y a 0 ligne.Donc, soit je définirais initialement lineas = 1 ou si vous ne savez pas s'il y aura ou non du contenu, vous pouvez vérifier s'il contient des personnages, donc après votre temps, ou quelque part dedans, dites if lineas == 0 then check for characters

Une autre chose à considérer est quelque chose appelé Numéros magiques.C’est ce qu’est votre 2048.J'envisagerais de résoudre ce problème en faisant de 2048 une variable « globale ».

Flux suggéré

Utilise ton while déclaration au lieu de votre for déclaration.Mais fais, while(a != EOF) où a est un char alors continue à faire fgetc.Ensuite, placez-le simplement dans un tableau de caractères de taille 2048 À LA FIN du tableau et travaillez à rebours (ou vous pouvez le mettre dans le tableau de caractères de 0 à autant de caractères, puis avoir une boucle for qui va en arrière... c'est-à-dire où un comptoir serait pratique).Mais tu veux avoir un if a=='\n' puis imprimez la ligne à l'envers et réinitialisez l'index du tableau à 2048.Je suggérerais également d'avoir un compteur qui compterait le nombre de caractères afin que lorsque vous reculez dans le tableau, vous n'ayez pas à tout parcourir jusqu'à ce que 2048-counter.

Cela devrait vous aider avec un flux plus concis.Vous n’aurez pas non plus besoin d’autant de code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top