Zeile in einer Textdatei mit bestimmtem Anfangsbuchstaben löschen
-
Hallo!
Mir liegt eine Textdatei folgenden Formats vor:@ Name = "Blabla" @ Datum = "2009-09-23" @ Uhrzeit = "12:45" * Name x y "AAA" 1 2 "BBB" 3 4 "CCC" 5 6
Diese Datei möchte ich mit einem anderen, selbstgeschriebenen Programm weiter auswerten. Hierzu darf ich aber nur die Punktepaare (x/y) in einer Datei stehen haben, bedeutet:
a) Die Zeilen, die mit "@" oder "*" anfangen, müssen gelöscht werden.
b) Und zu guter letzt auch noch die Namen, die sich innerhalb der Anführungsstriche befinden.Aber wie soll ich das anstellen? Die Datei kann ich mit fprintf (korrigiere: fscanf) nicht einlesen. Dann bekomme ich eine Fehlermeldung - die Datei ist ja nicht einheitlich formatiert. Also bewerkstellige ich das mit getline():
#include<stdio.h> #include<stdlib.h> int main(int argc, char **argv) { fflush(stdin); int nRet; size_t *t = malloc(0); char **gptr = (char **)malloc(sizeof(char*)); *gptr = NULL; inputdatei = fopen(argv[1], "r"); while( nRet=getline(gptr,t,inputdatei)>0 ) fputs(*gptr, stdout); // zum Prüfen, was eingelesen wurde fclose(inputdatei); return 0; }
Die Datei habe ich jetzt also im Speicher.
Die nächsten Schritte wären nun:
[] Suche nach Zeilen, die mit "@" oder "" beginnen.
[] Lösche die gefundenen Zeilen.
[] Lösche die erste Spalte (die mit den Namen) der Tabelle
[*] Schreibe die übriggebliebene (Zahlen-)Tabelle in eine neue Datei.Kann mir jemand weiterhelfen?
Schon mal vielen Dank fürs Kopfzerbrechen!
-
Oli90x schrieb:
Die Datei kann ich mit fprintf nicht einlesen.
Das kann keiner...
-
*grmpf*
fscanf meinte ich...
-
Ich würde die Datei erst mal zeilenweise einlesen getline oder fgets oder so.
Dann pruefen, ob ich die daten will, wenn ja,
strcpy inhalt in neuen String und den kann man ja
dann problemlos mit sscanf nach den Werten auslesen.
Der neue string ist ja dann einheitlich, da da ja nur noch
die "relevanten" Datensätze drin sind.
-
Aber auf diese Prüfung kommt es mir unter anderem an.
Mit welchem Befehl prüfe ich denn, ob der erste Buchstabe eines Strings beispielsweise ein "@" ist?
-
Hallo,
if (**gptr == '@') { /* @ am Zeilenanfang gefunden */ }
MfG,
Probe-Nutzer
-
Hallo Oli90x,
dir fehlen anscheinend noch einige Grundlagen.
Auch deine gepostete Einleseroutine ist fehlerhaft, du allozierst überhaupt nicht korrekt den Speicher und dies müßte dann irgendwann zum SegFault führen...size_t *t = malloc(0); char **gptr = (char **)malloc(sizeof(char*)); *gptr = NULL;
Das ist leider völliger Humbug!!!
-
Oli90x schrieb:
Die Datei habe ich jetzt also im Speicher.
Welchen Zauberspruch sagst du vorher auf, damit der Code funktioniert?
-
aah, von hier:
http://www.win-tux.de/c_018_015.htm#RxxobKap01801504002A251F0401A4
scheint also doch tatsächlich so zu funzen!
-
@Probe-Nutzer: Vielen Dank! Das war der entscheidende Hinweis!
Mittels einer if-Bedingung habe ich mir dann die Zeilen rausgesucht, die nicht mit "@" beginnen. Diese Zeilen wurden dann sukzessive mit sscanf und den entsprechenden Formatelementen analysiert, wobei ich zuvor für die Buchstaben ein char-array ausreichender Größe bereitgestellt habe. Danach konnte ich die gewünschten Zahlen in eine neue Datei schreiben.**
@Th69:** Wie zauber0r richtig bemerkt hat, habe ich den Code von besagter Internet-Seite "geklaut". Und er funktioniert einwandfrei.
-
@Th69: Wie zauber0r richtig bemerkt hat, habe ich den Code von besagter Internet-Seite "geklaut". Und er funktioniert einwandfrei.
Was tun, wenn dir jemand nur sagt, dass dir Grundlagen fehlen? Ignorieren wird das beste sein. Die Leute sagen das irgendwelchen Gründen, die man nicht verstehen kann.
Solche Phrasen kommen aus dem C++-Forum, wo ihr Nährboden gewaltig ist. Ich wäre betrübt, wenn wir solche Umgangstöne auch hier einbrechen lassen.
-
zauber0r schrieb:
aah, von hier:
http://www.win-tux.de/c_018_015.htm#RxxobKap01801504002A251F0401A4
scheint also doch tatsächlich so zu funzen!aber was soll das 'malloc(0)' da bedeuten? das stimmt doch was nicht.
-
µngbd schrieb:
@Th69: Wie zauber0r richtig bemerkt hat, habe ich den Code von besagter Internet-Seite "geklaut". Und er funktioniert einwandfrei.
Was tun, wenn dir jemand nur sagt, dass dir Grundlagen fehlen? Ignorieren wird das beste sein. Die Leute sagen das irgendwelchen Gründen, die man nicht verstehen kann.
Solche Phrasen kommen aus dem C++-Forum, wo ihr Nährboden gewaltig ist. Ich wäre betrübt, wenn wir solche Umgangstöne auch hier einbrechen lassen.
Ich hab ja auch niemals behauptet, dass ich der perfekte Programmierer bin. Und ich habe auch wirklich gehofft, hier Hilfe zu finden. Und ich wurde nicht enttäuscht...
Mir ist klar, dass ich noch viel zu lernen habe. Aber Kommentare wie "dir fehlen noch die Grundlagen" helfen einem Newbie ja auch wirklich nicht weiter.
-
;fricky schrieb:
aber was soll das 'malloc(0)' da bedeuten? das stimmt doch was nicht.
So schreibt man Programme, die auch auf Systemen mit ganz wenig RAM laufen.
-
aber was soll das 'malloc(0)' da bedeuten? das stimmt doch was nicht.
Seltsam. Das ist schon wieder typisch für den spirit of C: ja keine Fehlermeldungen bringen.
Ich hab nachgeschlagen:
7.20.3 schrieb:
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
Meine Compiler/Interpreter machen alle letzteres.
Wozu soll das gut sein?
-
Und ich habe auch wirklich gehofft, hier Hilfe zu finden. Und ich wurde nicht enttäuscht...
Darum geht's ja auch. Wenn das anders wäre, sollten wir schleunigst das sinkende Schiff verlassen.
-
µngbd schrieb:
7.20.3 schrieb:
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
Meine Compiler/Interpreter machen alle letzteres.
mach das mal zweimal hintereinander, um zu testen ob malloc dabei jedesmal denselben wert ausspuckt.
µngbd schrieb:
Wozu soll das gut sein?
für nichts wohl. ich glaub das ist ein fehler in dem code.
-
fricky schrieb:
mach das mal zweimal hintereinander, um zu testen ob malloc dabei jedesmal denselben wert ausspuckt.
Spuckt verschiedene Werte aus:
CINT/ROOT C/C++ Interpreter version 5.16.29, Jan 08, 2008 root [0] int *p1 = malloc(0); root [1] int *p2 = malloc(0); root [2] printf("%d %d\n", p1, p2); 144697360 144697640 root [3] free(p1), free(p2);
Ähnlich beim gcc. Wobei die beiden vielleicht die gleiche malloc() verwenden.
Kurze Suche:
http://gcc.gnu.org/ml/gcc/2000-06/msg00202.htm schrieb:
There is already code in libgcc (new*) that does assume malloc(0) and
free(NULL) are bad things.http://lists.freebsd.org/pipermail/freebsd-hackers/2006-June/016982.html schrieb:
> I assume the behaviour is meant to show up programming errors:
> "If you use malloc(0) and are crazy enough to access the 'allocated'
> memory we give you a SIGSEV to show you how dumb you are :-)".Yes.
Nun gut, mag sein.
-
µngbd schrieb:
fricky schrieb:
mach das mal zweimal hintereinander, um zu testen ob malloc dabei jedesmal denselben wert ausspuckt.
Spuckt verschiedene Werte aus
ok, dann legt das dumme malloc auf'm heap wohl nur eine instanz der verwltungsstruktur an, ohne weiteren speicher dazu. d.h. in dem fall musste sogar 'free' machen.
-
;fricky schrieb:
ok, dann legt das dumme malloc auf'm heap wohl nur eine instanz der verwltungsstruktur an, ohne weiteren speicher dazu. d.h. in dem fall musste sogar 'free' machen.
Klingt logisch. Btw: die Differenz der beiden Zeiger war 280 Bytes. Glaubt ihr, dass das die Größe einer solchen Instanz ist? Wäre recht viel, denke ich; aber was weiss schon ich.