Zeilen entfernen
-
hi ich möchte daten aus einer datei lesen, die dort (in dieser datei) schön strukturiert gehalten werden: z.B. test.inp
1.Zeile Hans Wurst 90 2.Zeile Hans Wurst 90 #peter neu blöd 89 3.Zeile Hans Wurst 90 4.Zeile Hans Wurst 90 #frank neu blöd 88
wie kann ich jetzt diese datei auslesen ohne aber auf die Zeilen mit # einzugehen? ich möchte also nur die 4 "wirklichen" Zeilen in einer variable (meinetwegen var) speichern. Wie kann ich das machen? Gibt es sowas wie zeilenweise einlesen??? Ich habe es bisher nit fgets versucht. Kann ich dort vorher eine Abfrage machen wie z.B. in Java? Gibt es eine Methode wie z.B. starts with?
-
Also mit fgets liegst du schon mal richtig zum zeilenweisen Einlesen. Allerdings gibts da leider nicht so eine Möglichkeit wie du mit starts with gemeint hast. Aber du kannst mit fgets() ja erstmal in eine andere Variable die Zeile einlesen und dann dort abprüfen, ob die Zeile mit einem # beginnt. Wenn das nicht der Fall ist, dann kopierst du den Inhalt einfach in deine Sammelvariable.
-
und wie kann ich prüfen ob die Zeile mit # anfängt? Mit strstr?? Oder gibts da noch was schöneres?
-
Also, wenn der # IMMER nur an der ersten Stelle stehen kann und dann die Zeile nicht interpretiert werde darf, dann würde es reichen das erste Element deines Char-Arrays, in das du ja deine Zeile einlesen musst, abfrägst. So z. B.:
... fgets(zeile, sizeof(zeile), fp); if(*zeile != '#') ...
Wenn der # allerdings auch nicht nur an der ersten Position auftauchen darf, sondern davor, z. B. noch Leerzeichen sein dürfen, dann müsstest du das Ganze etwas umständlicher machen. Da müsstest du dann mit strchr() die Position des # ermittlen und dann noch prüfen, ob sich davor nur White-Space-Zeichen befinden.
-
es kann sogar sein, dass wenn eine zeile mit #hallo beginnt nicht übersprungen werden darf, und andere, die mit # hallo beginnen sollen übersprungen werden.
Kann ich das so machen, dass ich mir erst mit strstr den String in jeder Zeile suche und wenn ich ihn gefunden habe, soll die Zeile übersprungen werden??z.B. #peter dfds sfdsf sf
...soll gelöscht werden, aber
#bernd dfds sfdsf sf
...soll nicht gelöscht werden. Ich würde mir jetzt in jeder Zeile also meinetwegen den String "#ber" suchen, und überall wo der String drin ist, soll übersprungen werden.
Kann ich dann da auch fragen:if(*zeile != "#ber")
-
Also wenn der Teilstring, den du zum Auslassen immer nur ganz am Anfang der Zeile stehen kann, dann würde ich strncmp() (vergleicht n Zeichen zweier Strings) verwenden. Wenn, wie davor schon beschrieben, auch Leerzeichen vor dem gesuchten Teilstring stehen dürfen oder sogar andere Zeichen, dann musst du mit strstr() arbeiten und ggf. noch andere Abprüfungen machen.
Beispiel für strncmp:
... char suche[10] = "#ber"; char zeile[100] = "#bernd dfds sfdsf sf"; //Überprüft, ob zeile mit suche anfängt if( !strncmp(zeile, suche, strlen(suche)) ) { //zeile fängt mit suche an ... } else { //zeile fängt nicht mit suche an ... } ...
-
Ich würde das Thema erstmal wie folgt angehen.
- Alle Regeln aufschreiben die für eine Zeile gelten.
- Wenn eine Zeile die mit <whitespace#> beginnt eine Kommentarzeile ist, würde
ich es tunlichst vermeiden dafür Ausnahmen zu definieren. Wenn also in
sinnvollen Kombinationen ein <whitespace#> am Anfang stehen darf, würde ich
mir eine anderes Kommentatzeichen aussuchen Beispiele (";","//",...)
- Den Leseprozess würde ich dann wie folgt aufbauen.char buffer[128+1]; FILE *fp; //.... while (NULL!=fgets(buffer,fp) { if (TRUE==CheckCmt(buffer)) continue; // hier irgendeine sinnvole Arbeit mit Buffer }