Umkehren von stdin in C
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
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.