Buchstabe einer Datei als Variable speichern
-
Hallo
Ich suche eine Möglichkeit eine Datei, ohne den letzten Buchstaben, auf dem Bildschirm auszugeben und den letzten Buchstaben in einer Variablen zu speichern.
Ich habe es auf folgende Weise probiert:
(quelle=fopen("datei.txt","a+")); fseek(quelle, 0L, SEEK_SET); while( (c=getc(quelle)) != '*') putc(c,stdout); fseek(quelle, -0L, SEEK_CUR); while( (c=getc(quelle)) != EOF) if (c == "b") printf("gleich"); if (c != "b") printf("ungleich");
* ist das Zeichen vor dem letzten Buchstaben und der letzte Buchstabe in der Datei datei.txt ist ein b
trotzdem gibt er mir immer ungleich aus, obwohl es eigentlich gleich heißen sollte.Außerdem kommt noch folgende Fehlermeldung:
aktuell.c: In Funktion »main«:
aktuell.c:14: Warnung: Vergleich zwischen Zeiger und Ganzzahl
aktuell.c:16: Warnung: Vergleich zwischen Zeiger und Ganzzahlund wenn ich c mit
printf("%c",c);
ausgeben will, ist die Ausgabe immer �.
Ich hoffe ihr könnt mir helfen, bin hier schon fast am verzweifeln.
Gruß Isgri
-
du musst
if(c= 'b')
machen
also ' statt " !!!
-
sorry
if(c== 'b')
-
Danke
Jetzt gibt er aber, wenn es gleich ist gleich und ungleich aus, wenns ungleich ist aber nur ungleich
und wenn das zweite if durch ein else ersetze, gibt er mir gleich dreimal ungleich aus und bei gleich gibt er ungleich, gleich ungleich aus
irgendwie komisch^^Gruß Isgri
-
Du hast halt auch die Klammern souverän weggelassen. So sollte das gehen:
(quelle=fopen("datei.txt","a+")); fseek(quelle, 0L, SEEK_SET); // auch unnötig, nach fopen() steht's nun mal am Anfang while( (c=getc(quelle)) != '*') // überliest alles bis zum ersten '*' und gibt's aus putc(c,stdout); fseek(quelle, -0L, SEEK_CUR); // und noch mal von vorne ? while( (c=getc(quelle)) != '*'){ if (c == 'b') printf("gleich"); if (c != 'b') printf("ungleich"); }
In der Kürze liegt die Würze:
while ( (c = getc( quelle))){ if ( c == EOF || c == '*') break; putchar( c, stdout); } rewind( quelle); while ( (c = getc( quelle)) != EOF) printf( c == 'b' ? "gleich" : ungleich");
-
Danke
hab deine Lösung mal ausprobiert
als erstes kam die Fehlermeldung
aktuell.c:14: Fehler: zu viele Argumente für Funktion »putchar«
hab dann das putchar wieder durch putc ersetzt
dann gabs zwar keine fehlermeldung mehr aber ganz viele ungleichs in der ausgabeGruß Isgri
-
Ups - vertippt.
Was ist eigentlich in der Datei ?
-
erst mehrere zeilen text
dann ein * zum trennen
und dann 1 buchstabe (kleines b)
danach nichts mehr
-
Poste mal den kompletten Code.
-
ok, hier
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *quelle; int c; char datei[20]; long pos = 0; (quelle=fopen("datei.txt","a+")); fseek(quelle, 0L, SEEK_SET); while( (c=getc(quelle)) != '*') putc(c,stdout); fseek(quelle, -1L, SEEK_CUR); while( (c=getc(quelle)) != EOF) if (c == 'b') printf("gleich"); if (c != 'b') printf("ungleich"); }
Die datei sieht so aus
text
text
text
text
text
*
bist der letzte buchstabe der datei kein b kommt die meldung ungleich, ist er ein b lautet die ausgabe gleichungleich
-
Da fehlen immer noch die Klammern um das while, dann sollte es gehen.
So wird nur die erste Anweisung nach dem while ausgeführt und es kommt
natürlich doppelt.
-
ne, geht leider nicht
wenn ich eine klammer um das while mach, gibts ne fehlermeldung
und wenn ich welche um die if-anweisungen mache, dann wird die ausgabe wieder länger
-
Poste Code ...
-
hier:
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *quelle; int c; char datei[20]; long pos = 0; (quelle=fopen("datei.txt","a+")); while( (c=getc(quelle)) != '*') {putc(c,stdout);} fseek(quelle, -2L, SEEK_END); while( (c=getc(quelle)) != EOF) {if (c == 'b') printf("gleich"); if (c != 'b') printf("ungleich");} }
-
zefix, mach doch mal diese §%§&§%-Klammern rein, dann geht's:
while( (c=getc(quelle)) != EOF)[b]{[/b] {if (c == 'b') printf("gleich"); if (c != 'b') printf("ungleich"); [b]}[/b]
-
aber das sind doch die gleichen wie ich hatte, nur das sie jetzt eine zeile drüber bzw. drunter stehen
das sollte doch eigentlich egal sein, wo die stehen, oder?
geht übrigens immer noch nicht.
kann es vielleicht sein, das es irgendwie am compiler/OS liegt, dass es bei mir net geht?
-
Sorry - ich gebe das jetzt auf und buche das auf Deine Ignoranz, Beratungsresistenz und Doofheit.
Lerne Word-Basic.Verplempere anderer Leute Zeit, nicht mehr meine.
-
wenn man es als beratung bezeichnet den code praktisch unverändert zurückzugeben, und zu behaupten, er funktioniere, dann kann man mich wirklich als beratungsresistent bezeichnen^^
(wenn mir jemand erklärt wieso es einen unterschied macht, ob die { am ende der zeile steht oder am anfang der nächsten zeile, dann nehm ich alles zurück (zumindest mein compiler macht da anscheinend keinen unterschied))
-
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *quelle; int c; char datei[20]; long pos = 0; quelle=fopen("datei.txt","a+"); while( (c=getc(quelle)) != '*') { putc(c,stdout); } fseek(quelle, -2L, SEEK_END); while( (c=getc(quelle)) != EOF) { if (c == 'b') printf("gleich"); if (c != 'b') printf("ungleich"); } }
so hier der code bischen gescheid eingerückt... was geht jetzt nicht????
P.S.: am ende solltest noch
fclose(quelle);
machen
was passiert wenn du die erste while schleife und das fseek weg lässt? findest er dann das b?
-
BorisDieKlinge schrieb:
while( (c=getc(quelle)) != '*') { putc(c,stdout); }
besser so. ist lesbarer und provoziert keine 'assignment in condition' compiler-warnungen:
for (;;) { int c = getc(quelle); if (c == '*') break; putc (c, stdout); }
und dafür
BorisDieKlinge schrieb:
if (c == 'b') printf("gleich"); if (c != 'b') printf("ungleich");
gibts 'else'