zeilenweise aus datei lesen
-
http://www.cppreference.com/stdstring/strstr.html
(strstr(a,b) == a) sollte ähnlich wirkenalso wenn
a = "cppreference..." und
b = "cppreference"
dann geht strstr. umgedreht allerdings nicht.
-
The function strstr() returns a pointer to the first occurrence of str2 in str1, or NULL if no match is found.
das sagt mir, dass nach \n irgendwo in dem string gesucht würde. es ist aber in jeder zeile ein \n vorhanden... (jede zeile hat ein ende, nur die wurst hat zwei)
mein ziel ist es aber, festzustellen, ob \n der einzige inhalt des string ist. ist das der fall, soll die zeile nicht gedruckt werden (weder auf dem Bildschirm noch in eine datei)
aber geht das überhaupt so? ist wegen getc nicht noch zusätzlich ein \0 in jeder zeile?
-
hm, dann vll ein strcmp() mit "\n" oder "\r\n"?
oder du schreibst dir ne trimfunktion, die das \n (und vll auch \r) am ende wegnullt und dann strlen() drauf
-
eingentlich sollte deine korrigierte schleife funktionieren...
das es trotzdem nicht geht könnte daran liegen, das die leerzeilen vielleicht neben dem new-line auch noch leerzeichen enthalten.
und es gibt noch eine andere möglichkeit. die dateinamen "finder_input.html" etc lassen darauf schließen, daß du auf einem apple programmierst. ich kenn mich zwar mit dem apple nicht aus, aber ich habe gehört, daß der als zeilenende carriage-return benutzt. eigentlich sollte die ansi-c-dateifunktionen das cr nach lf übersetzten, aber möglicherweise hat die bibliothek deines compilers ja einen fehler. versuche also einfach mal, die zeilen mit "\r" anstelle von "\n" zu vergleichen.
außerdem wäre es noch sinnvoll, das makro zeile von 20 auf 256 oder so zu setzten. 20 zeichen pro zeile sind schon ein bißchen wenig. das ist zwar kein richtiger fehler, würde aber dazu führen, daß dein programm eine zeile in mehrere zerlegt. davon merkst du zwar normalerweise nichts, da, wenn die zeile unvollständig eingelesen wird, auch kein nl in der gelesenen zeile drin ist, aber deine testausgabe printf("%i", iPufferlen) würde dann mitten in der zeile erscheinen.
-
Die 20 Zeichen reichen aus, ich schau mir ja die ausgabe an. ich habe mal die zeilenlängen zählen lassen, die leerzeilen enthalten sehr häufig 2! zeichen. also \n +\0 ??
ich schreibe auf einem normalen pc mit suse 9.2.
vielleicht bin ich ja nicht in der lage, das mit c zu machen... ich schau mir mal perl an, stringmaipulation soll ja dessen große stärke sein. schade nur um die zeit bis jetzt.
vielen dank für eure hilfe
-
fgets(..,input,..) len=strlen(input); for (i=0;i<len;i++) { if (0!=isspace(input[i]) //irgendetwas anderes als whitespace in Zeile dann //schreibe { if('\n'!=input[i]) // aber nur falls es nicht nweline ist fputs(..,input,..) break; } }
-
vielen dank, aber das ändert nichts.
die ausgabe sieht immer noch genauso aus. so langsam vermute ich, dass vielleicht das auslesen nicht so läuft, wie ich es gern hätte. aber die ursprungsdatei (html) sieht ganz normal aus. vielleicht sollte ich eine andere funktion für das zeichenweise auslesen der html-datei benutzen? aber zeichenweise muss es schon sein, damit ich alles bekomme, was zwischen >< steht. entweder da steht nix (auch kein leerzeichen), oder eben der text, an den ich ran will.
-
warum liest du nicht zeilenweise mit fgets und bearbeitest die Zeile selber.
Wenn du das file mit fopen(...,"rt") öffnest wird aus den zwei zeichen cr (ox0d) und lf (0x0a) ein Zeichen 0x0a gemacht.
Wenn du das file mit fopen(...,"rb") öffnest wird diese umsetzung nicht gemacht
In Unix gibt es diesen Unterscheidung nicht, und ich arbeite auch unter Windows inzwischen meistens mit "..b";
Wenn du die Zeile gelesen hast mach doch aus dem \n am Zeilenende ein 0x00 und gib die Zeile auf dem Bildschirm mit
printf("]%s[\n");
aus (Steinzeitdebugging aber immer noch genial), die rechteckigen Klammern sind bewußt so gewählt, was innerhalb von denen ist gehört zum string auch wenn noch Steuerzeichen drin sind kann man das dann erkennen.
Wenn das venünftig funktioniert kannst du dir Gedanken machen wir du diese Zeile dann für dein Programm vernünftig interpretiertrst.
Viel Spaß
-
warum macht ihr das nicht so, dass ihr einfach mal jede zeile in einen string einliest und dann mit
/*int*/laenge=strlen(gelesenezeichenkette);
überprüft ob nur 1 zeichen drinnsteht dass ist dann das /n zeichen und falls das der fall ist diese zeile einfach überspringen...
-
@iso ob deine 20 Zeichen reichen weis ich nicht, dein Beispiel hat 25 Zeichen in der Zeile.
Außerdem sollte man nicht vergessen, das man für die schließende 0 eine Zeichn extra reservieren muss. Wenn man das nicht tut wird das Zeilenende oftmals ab und zu überschrieben oder überschreibt andere Daten was dann zu einer lustigen Fehlersuche führt.Ich wähle den InputBuffer für eine LeseRoutine immer groß typischerweise 128 Zeichen +1 für die \0.
ASCII-Files haben die unangenehme Eigenschaft, das sie vom Nutzer "nur mal eben angeschut werden
" und dann dadurch oftmals nicht mehr der gedachten Definition entsprechen. Aus diesem Grunde lese ich diese in einen großen Input Buffer und speichere sie unter Kontrolle der Definiton in die endgültigen Daten um.
#define NORMSTRINGLEN 128 +1 char InputBuffer[NORMSTRINGLEN]; ... while(!fgets(fp,InputBuffer,128)) { CheckComment(InputBuffer); // Entfernt Kommentare am Ende der Zeile und // ersetzt das CRLF bzw LZ durch \0 if (0==StrRemoveTrailingLeading(InputBuffer)) // Entfernt alle Whitespacecharacter vor dem ersten continue; // und nach dem letzten Zeichen. Der returnwert ist 0 // falls der String leer ist und stringlen anderfalls. ... // Bearbeiten des Strings }