Anzahl von Zeilen in einer Datei bestimmen.
-
Hallöchen,
der Titel des Themas sagt ja eigentlich schon, was ich erreichen möchte.Mein momentner Code sieht so aus:
int umbruchzahl(FILE *text) { int i, c; i=0; while(1) { c = fgetc(text); if (c==EOF) break; if (c=='\n') i++; } return i; }
Das Problem liegt darin, dass mein Programm immer sagt, in meiner Datei wären 0 Zeilen, allerdings sind 3 enthalten.
Ich gehe mal schwer davon aus, dass die Abfrage in Zeile 8 so nicht funktioniert. Oder doch?
fgetc liefert ja int Werte zurück; liegt das Problem da?
Habs allerdings auch schon mit nem cast zu char probiert und es hat sich nichts geändert.
Kann mir jemand weiterhelfen?MfG
m0pf
-
Es sollte aber normalerweise genau so funktionieren...
Zeig' doch mal, wie du die Datei öffnest, wie du prüfst, ob das Öffnen geklappt hat und die Funktion aufrufst.Ist der Dateiinhalt wirklich noch der Gleiche? Hast du das noch einmal überprüft?
Denn wenn ich Mal ins Blaue raten würde: Du öffnest die Datei zum Schreiben (mit "w"), überschreibst den alten Inhalt und liest natürlich nur ein EOF ein.
Btw: Ausgaben des Debuggers oder manuell mit printf an einigen Codestellen helfen normalerweise ungemein.
-
Mach doch vor dem while ein if( text == NULL) return -1;
Oder hast du schon vorher etwas aus der Datei gelesen?
-
Ok, dann post ich mal den kompletten Code.
Ich möchte jedoch noch darauf hinweisen, dass das bestimmen der Anzahl an Zeichen allgemein (inklusive '\n') problemlos funktioniert.
Meine Datei sieht wie folgt aus:
[datei]
123
456
789
[/datei]Die Anzahl an Zeichen zählt er korrekt mit 11 (also zählt er Zeilenumbrüche mit).
Als Zeilenanzahl spuckt er mir 0 aus, warum auch immer...# include <stdio.h> int zeichenzahl(FILE *text) { int i, c; i=0; while(1) { c = fgetc(text); if (c==EOF) break; i++; } return i; } int umbruchzahl(FILE *text) { int i, c; i=0; while(1) { c = fgetc(text); if (c==EOF) break; if (c=='\n') i++; } return i; } int main() { FILE *datei; datei = fopen("datei.dat", "r"); if (datei == NULL) { printf("Fehler beim Einlesen"); return 1; } else printf("Erfolg beim Einlesen!\n\n"); fprintf(stdout, "Die Datei besitzt %i Zeichen.\n", zeichenzahl(datei)); fprintf(stdout, "Die Datei besitzt %i Zeilen.\n", umbruchzahl(datei)); fclose(datei); return 0; }
[cpp]
-
Wenn ich dir folgendes verrate:
zeichenzahl
liest bis zum Dateiendeumbruchzahl
wird unmittelbar darauf aufgerufen, natürlich wird das EOF-Zeichen gelesen
Bei deiner Kenntnis von C würde ich dir raten, die Datei zweimal zu öffnen.
-
Achso, ich hab gedacht der liest die Datei dann wieder von vorne.
Naja wenn er ja dann immer noch bei EOF steht is ja klar dass er mir sagt ich habe 0 Zeilen
-
Tja, da würde ich mal sagen, daß du die Datei bereits beim Zählen der Zeichen bis zum Ende gelesen hast.
Dann ist klar, wenn du dann nochmal versuchst in der geöffneten bis zum Ende zu lesen, die das Ende bereits erreicht hat.Edit: Tja, zu spät..
-
Hab den Code der main Funktion nun so abgeändert:
int main() { FILE *datei; datei = fopen("datei.dat", "r"); if (datei == NULL) { printf("Fehler beim Einlesen"); return 1; } else printf("Erfolg beim Einlesen!\n\n"); fprintf(stdout, "Die Datei besitzt %i Zeichen.\n", zeichenzahl(datei)); fclose(datei); datei = fopen("datei.dat" , "r"); fprintf(stdout, "Die Datei besitzt %i Zeilen.\n", umbruchzahl(datei)); fclose(datei); return 0; }
Funktioniert
Achja und den Startwert der Zeilen hab ich auf 1 gesetzt, da die erste Zeile ja sonst nie mitgezählt wird
-
Um nicht noch extra nen Thread zu eröffnen:
Das nächste was in das Programm rein soll, ist das es mir sagt wieviele Buchstaben bzw. Ziffern in der Datei vorhanden sind.
Kann ich das irgendwie mit Hilfe des ASCII Codes machen oder hat da sonst wer nen Tip für mich?
-
m0pf schrieb:
Achja und den Startwert der Zeilen hab ich auf 1 gesetzt, da die erste Zeile ja sonst nie mitgezählt wird
Du wirst die letzte Zeile nicht erkennen, wenn die Zeile nicht mit '\n' abgeschlossen ist.
int umbruchzahl(FILE *text) { int i, c, z; i=0; z= 0; while(1) { c = fgetc(text); if (c==EOF) break; z++; // Zeichen in der aktuellen Zeile zaehlen if (c=='\n') { i++; z = 0; } } if (z != 0) i++; // sind noch Zeichen in der letzten nicht abgeschlossenen Zeile return i; }
Zur neuen Frage:
Schau dir mal isalpha und isdigit und so aus der <ctype.h> an
-
Und ausserdem rewind(..) aus der stdlib.h
-
Sorry, dass ich diesen Beitrag erneut rauskrame, aber es dreht sich nocheinmal um das selbe Programm.
Irgendwie schaff ich es nicht, dass mir das Programm die gelesenen Zeichen in einer anderen Datei abspeichert...Hier mal die relevanten Codestellen:
Zum ersten meine "Speicherfunktion"
void speichern (FILE *text , FILE *ausgabe) { int c; while (1) { c=fgetc(text); if (c=EOF) break; fputc(c , ausgabe); } }
Hier die Teile aus der Main:
int main(int argc, char *argv[]) { FILE *datei, *speicher; int i; datei = fopen(argv[1], "r"); speicher=fopen(argv[2] , "w"); . . . speichern(datei , speicher); fclose(datei); fclose(speicher); }
Meine Fehlerüberprüfung liefert mir beim Einlesen von Lese- und Schreibdatei keinen Fehler zurück.
Mein Notepad++ meldet auch immer wenn ich danach wieder auf den Reiter der Speicherdatei klicke, dass der Inhalt geändert wurde, allerdings bleibt die Datei leer und ich verstehe nicht warum...
Gibts da was, dass ich übersehn habe?
Die Lesedatei ist auch mit fseek auf Dateianfang zurückgestellt worden...
-
Kann mir da keiner weiterhelfen?
-
Hmm, ich sehe da so etwas:
if (c=EOF) break;
Warum nicht == statt = ???
-
Ouh, das hab ich übersehn...
Hab es aber gerade geändert und es hilft trotzdem nicht.
Ich hab echt keine Ahnung was da dran falsch ist/sein könnte...
-
Also bei mir läuft es einwandfrei.
Habe es gerade mal getestet.
-
#include <stdio.h> using namespace std; void speichern (FILE *text , FILE *ausgabe) { int c; while (1) { c=fgetc(text); if (c==EOF) break; fputc(c , ausgabe); } } int main(int argc, char *argv[]) { FILE *datei, *speicher; int i; datei = fopen(argv[1], "r"); speicher=fopen(argv[2] , "w"); speichern(datei , speicher); fclose(datei); fclose(speicher); }
-
Hmm...
Könnte es vielleicht am Compiler (MinGW) liegen oder eventuell daran, dass ich mit Windows statt Linux arbeite?
Ist die verzweifelte letzte Idee, die ich habe...
-
Wie sieht denn dein Argument aus?
So? "prog.exe pfad/datei.bla" Unix!
Oder so? "prog.exe pfad\datei.bla" Ganz falsch!
Oder so? "prog.exe pfad\\datei.bla" Windows!
-
Ich arbeite auch mit MingW unter Windows.
Teste mal den Code, den ich zuletzt gepostet habe.
Vielleicht stimmt ja irgendwas mit dem Rest deines Codes nicht.
Diese extrahierte Version jedenfalls läuft.