zeilenweise aus datei lesen
-
hi, habe folgendes problem: und zwar habe ich eine Datei die wie folgt aussieht:
test.txt
blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla ....
Es handelt sich um eine einfache Textdatei, in der irgendwas drin steht, nur leider ab und zu eine zeile leer ist.
Ich möchte jetzt diese Datei (mit fgets?) einlesen und alle Leerzeilen entfernen und unter dem gleichen Namen wieder speichern (quasi überschreiben). Wie kann ich das am schnellsten und am einfachsten machen?
So soll die test.txt später aussehen:blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla blablablablablablablabla
Kann mir jemand helfen? Vielen Dank im Voraus...
-
int main(int argc, char *argv[]) { FILE *in; in = fopen("test.in", "r"); FILE *out; out = fopen("test.out", "w"); for(int i = 0; i < nZeilen/*anzahl der zeilen*/; ++i) { char szBuffer[1024] = {0}; if(fscanf(in, "%s\n", szBuffer) != 0) fprintf(out, "%s\n", szBuffer); } fclose(in); fclose(out); }
-
Machs besser mit fgets() und überprüfe den Buffer, ob nur ein \n enthalten ist (= Leerzeile).
@miller_m
fscanf() liest so nur bis zum nächsten White-Space-Char, aber nicht zum Zeilenende.
-
ich habe das selbe problem. meine blokade: ich weiss nicht, wie ich auf "\n" überprüfe.
while(fgets(puffer, zeile, pOutput)) { if(puffer != '\n') fputs(puffer, stdout); }
soll bewirken, dass keine leeren zeilen gedruckt werden...
-
strcmp, strlen, strstr
-
strstr ist ja blöd, da in jeder zeile ein "\n" vorkommt.
wozu strlen?
bei strcmp bekomme ich:fac.c:77: warning: passing arg 1 of `_IO_putc' makes integer from pointer without a cast
while(fgets(puffer, zeile, pOutput)) { if(strcmp(puffer, "\n") != 0) putc(puffer, stdout); }
-
lol, die fehlermeldung interpretierst du gefälligst selbst.
debuggen ist der einfachste teil am programmieren.
-
hmm, aus der bemerkung lerne ich leider nicht viel...
-
eine leerzeile ist eine zeile, die nur aus whitespaces besteht. du muß nur alle zeichen der zeile durchlaufen und wenn du auf etwas anderes als ein whitespace stößt (!isspace(c)), dann gebe die zeile aus. isspace() ist in <ctype.h> deklariert.
-
@iso
du mußt fputs() und nicht putc() verwenden.
-
ist ctype.h ansi?
-
ja
-
while(fgets(puffer, zeile, pOutput)) { if(puffer != '\n') puts(puffer); }
gibt:
warning: comparison between pointer and integer
gilt für die if-zeile
ich komm hier irgendwie nicht weiter...
-
puffer ist ein char*
'\n' ist ein charchar* ist ein pointer
char ist ein integerwarning: comparison between pointer and integer
was heißt das jetz wohl?
dass er dich *warnt*, dass du nen zeiger und ne zahl vergleichst.kriegst du das nicht selber raus?
wenn nicht, lerne es lieber schnell. weil das begegnet dir beim programmieren oft.(edit: die zeile war mir keinen neuen post wert)
freut mich, dass es richtig angekommen ist, ISO
-
da ist ja der nette kerl wieder, der immer nen dummen spruch zu drücken hat
-
dieser aussage entnehme ich, dass ich puffer nicht mit '\n', sondern mit einem zeiger, der auf die speicherstelle, welche \n enthält, vergleichen soll?
moment...ich müsste die inhalte der speicherstellen der beiden zeiger vergleichen...
wie war das noch...
&puffer == &cNewline ??
hier mal zur übersicht der gesamte code. ich habe ja vielleicht bei der deklaration der char was falsch gemacht?
#include <stdio.h> #include <string.h> #define input "finder_input.html" #define output "finder_output.txt" #define zeile 20 int main(void) { FILE *pInput; FILE *pOutput; int c, d, i=1, iZeilecount=1, iPufferlen=1; char puffer[zeile], cNewline[]="\n"; pInput = fopen (input,"r"); if (!pInput) printf ("\n\tDatei [pInput] laesst sich nicht oeffnen\n"); pOutput = fopen (output,"w"); if (!pOutput) printf ("\n\tDatei [pOutput] laesst sich nicht oeffnen\n"); while ((c = getc(pInput)) != EOF) { if (c == '>') { while ((d = getc(pInput)) != EOF) { if (d == '<') break; fputc(d, pOutput); } } } // ----------------------------------------------------------------------- // Dateien schliessen fclose (pInput); if (!fclose) printf("\n\tAchtung, Datei [pInput] nicht geschlossen\n"); fclose (pOutput); if (!fclose) printf("\n\tAchtung, Datei [pOutput] nicht geschlossen\n"); // ------------------------------------------------------------------------ pOutput = fopen (output, "r"); if (!pOutput) printf ("\n\tDatei [pOutput] laesst sich nicht oeffnen\n"); // ------------------------------------------------------------------------ // pOutput sortieren while(fgets(puffer, zeile, pOutput)) { iZeilecount++; iPufferlen=strlen(puffer); if(*puffer != *cNewline) { puts(puffer); printf("%i", iPufferlen); } } printf("\n\nDiese Datei hat %i Zeilen\n\n", iZeilecount); // ------------------------------------------------------------------------ // pOutput schliessen fclose (pOutput); if (!fclose) printf("\n\tAchtung, Datei [pOutput] nicht geschlossen\n"); return 0; }
-
-
ja, danke. das hatten wir schon!
aktuell:
while(fgets(puffer, zeile, pOutput)) { if(strcmp(cNewline, puffer) != 0) { fputs(puffer, stdout); } }
leider ändert das an der output-datei überhauptnix! der vergleich != bringt alle zeilen, der vergleich == bring dasselbe!
-
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?