PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c Leerzeilen aus einer Datei löschen



iso
01-06-2005, 14:28
Hallo,
ich möchte Daten aus einer html-datei (tabelle) in einer textdatei neu sortieren.
mit hilfe von getc (zeichenweise) habe ich schon mal die ganzen html-tags entfernen können und die reinen daten in eine andere datei geschrieben:
______________________________
while ((c = getc(pInput)) != EOF)
{
if (c == '>')
{
while ((d = getc(pInput)) != EOF)
{
if (d == '<')
break;
putc(d, pOutput);
}
}
}
_____________________________

Nun enthält die Datei aber noch sehr viele Leerzeilen, wo nur html-tags waren, aber keine daten.
wie bekomme ich die weg? erste ansätze:
______________________________
while(fgets(puffer, zeile, pOutput))
{
if(strstr(puffer ,"\n") != '0')
fputs(puffer, stdout);
}
______________________________

ausserdem müsste ich die daten noch in ein struct einlesen, damit ich nach später alphabetisch sortieren kann.

hier eine idee der daten:
_______________________________





Nachname, Vorname

PLZ

Strasse / Ort

Telefon / Telefax
E-Mail / Abteilung

________________________________


vielen Dank im voraus!

anda_skoa
01-06-2005, 15:59
'0' ist das Zeichen 0, nicht NULL

Ciao,
_

iso
02-06-2005, 11:22
'0' war natürlich blödsinn, NULL bringt aber auch nix...

while(fgets(puffer, zeile, pOutput))
{
if(strcmp(puffer, "\n") != NULL)
putc(puffer, stdout);
}

fehler:
warning: comparison between pointer and integer

klewan
02-06-2005, 12:09
man 3 strcmp

strcmp(s1,s2) wenn beide gleich sind also eine "==" dann kommt eine 0 raus

also


if(strcmp(s1,s2) == 0) {
printf("s1 == s2\n");
}

klewan
02-06-2005, 12:15
hmm aba da du ja mit putc() ausgibst

is das doch eh keine "string" dann mach doch einfach so




if(puffer == '\n') {

}

iso
02-06-2005, 13:08
while(fgets(puffer, zeile, pOutput))
{
if(puffer != '\n')
putc(puffer, stdout);
}

gibt das selbe. != (nicht gleich) ist schon richtig, denn ich will ja die zeilen haben, die NUR ein \n enthalten (also leer sind). alle anderen werden ausgegeben.

vergleich puffer != '\n' sagt also: alle, die nicht genau '\n' enthalten. also alle, die mehr oder weniger enthalten.

und putc will ich haben, damit die ausgabe bis zeilenende geht, nicht bis zum ersten leerzeichen oder so.

klewan
02-06-2005, 13:21
fgets() reads in at most one less than size characters
from stream and stores them into the buffer pointed to by
s. Reading stops after an EOF or a newline. If a newline
is read, it is stored into the buffer. A '\0' is stored
after the last character in the buffer.
:-)


also wenn du mit fgets was einliest bekommst du einen \0 terminierten string -> ergo mehr als einen buchstaben , nämlich immer mindestens einen buchstaben + ein \0, somit geht der direkte char vergleich und das putc nicht :-D




du müsstest es mit strcmp() und puts() probieren oder die if auf sowas in die richtung umändern:

fgets(buf, stdin);
if(buf[0] == '\n')
putc(buf[0])



kannst du nich das file einfach durch ein perl/shell/wasauchimmer script jagen das einfach alle "\n\n" durch "\n" ersetzt ?! :-D (vIm :1,$s/\n\n/\n/g)

iso
02-06-2005, 15:07
na, das ist es ja. bei "mal eben schnell" ist nix zu machen. ich hab auch nicht gedacht, dass das so lange dauern könnte...

BLUESCREEN3D
03-06-2005, 02:25
Brauchst du das unbedingt als C-Programm oder geht es nur darum, mal eben die Leerzeilen aus einer Datei rauszulöschen?

Falls es ein C-Programm sein muss:
Lies die Datei Byte für Byte ein und vergleich jedes Byte mit dem vorherigen. Wenn das vorherige und das aktuelle Byte beides Zeilenwechsel sind, dann wird das aktuelle Byte verworfen. Ansonsten wird es in die neue Datei geschrieben.

Falls es nur um die Anwendung geht:

grep . datei_mit_leerzeilen > neue_datei_ohne_leerzeilen