Frage

Ich brauche einen Rat, wie ich den Inhalt von stdin umkehren kann.Dies ist der Teil meines Codes, der die Umkehrung von stdin übernimmt:

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

Ich habe auch eine TXT-Datei namens example1 mit folgendem Inhalt:

LINE 1.1
LINE 1.2

LINE 1.4

Dieser Code funktioniert, wenn ich ihn ausführe ./myprogram < example1.txt.Es gibt aus

1.1 ENIL
2.1 ENIL

4.1 ENIL

Aber wenn ich es ausführe echo "This text should be reversed" | ./myprogram es gibt aus:

(

Das ist es.Eine offene Klammer.Ich habe festgestellt, dass es funktioniert, wenn ich den Teil meines Codes weglasse, der die Zeilen zählt, und einfach manuell sage, dass es eine Zeile gibt (natürlich für eine Zeile).

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

Es wird jetzt ausgegeben

desrever eb dluohs txet sihT
War es hilfreich?

Lösung

Zuerst zurückspulen stdin wird nicht unterstützt, es sei denn (theoretisch), dass es von einer Eingabedatei umgeleitet wurde.Und da es (jedenfalls weiß ich) keine Möglichkeit gibt, zu wissen, dass das passiert ist, machen Sie sich nicht die Mühe, es zu versuchen.

Entgegen der scheinbar weit verbreiteten Meinung muss jedoch nicht die gesamte Eingabe gepuffert werden.Sie können es weiterhin Zeile für Zeile puffern:

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

Ich bin mir ziemlich sicher, dass das das tun wird, was Sie suchen (oder zumindest in der Nähe davon).

Andere Tipps

Sie können nicht zurückspulen stdin!

Sie sollten Ihre Logik überarbeiten, sodass Sie bis lesen EOF anstatt zu versuchen, die Zeilen vorher zu zählen.

Eine andere Sache, die Sie sich ansehen sollten, ist Ihre Aussage, die Zeilen zählt ...

BEARBEITEN:Ich würde auch vorschlagen, stdin auf eine Variable zu setzen, die Sie manipulieren können.Also haben Sie so etwas wie temp = stdin Sie haben also immer die anfängliche Standard-Standardeinstellung und die Temperatur, die Sie nach Bedarf ändern können, und wenn Sie zurückgehen müssen, haben Sie immer noch die Standard-Standardeinstellung.

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

Wenn Sie darüber nachdenken, hat die von Ihnen eingegebene Zeile kein Zeilenumbruchzeichen, sodass Ihr Programm immer noch davon ausgeht, dass es 0 Zeilen gibt.Also würde ich entweder zunächst festlegen lineas = 1 Oder wenn Sie nicht wissen, ob es Inhalte geben wird, können Sie nach einiger Zeit oder an einer anderen Stelle im Inhalt nachsehen, ob darin Zeichen enthalten sind if lineas == 0 then check for characters

Eine andere zu berücksichtigende Sache ist etwas namens Magische Zahlen.Das ist Ihr 2048.Ich würde versuchen, das zu beheben, indem ich 2048 zu einer „globalen“ Variablen mache.

Vorgeschlagener Ablauf

Benutze Dein while Aussage statt Ihrer for Stellungnahme.Aber tun Sie es, while(a != EOF) wobei a ein ist char Also mach weiter fgetc.Fügen Sie es dann einfach in ein Zeichenarray der Größe 2048 AM ENDE des Arrays ein und arbeiten Sie rückwärts (oder Sie könnten es von 0 bis zu beliebig vielen Zeichen in das Zeichenarray einfügen und dann eine for-Schleife haben, die rückwärts geht ... das heißt wo ein Zähler praktisch wäre).Aber Sie möchten eine haben if a=='\n' Drucken Sie dann die Zeile rückwärts und setzen Sie den Array-Index auf 2048 zurück.Ich würde auch vorschlagen, einen Zähler zu haben, der die Anzahl der Zeichen zählt, damit Sie beim Rückwärtsgehen im Array nicht das Ganze nur bis durchlaufen müssen 2048-counter.

Dies sollte Ihnen zu einem prägnanteren Ablauf verhelfen.Sie benötigen auch nicht so viel Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top