Anzahl von Zeilen in einer Datei bestimmen.
-
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.
-
Also deine Version läuft....
Hier mal mein kompletter Code:# include <stdio.h> # include <ctype.h> # include <stdlib.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=1; while(1) { c = fgetc(text); if (c==EOF) break; if (c=='\n') i++; } return i; } int charzahl(FILE *text) { int i, c; i=0; while(1) { c = fgetc(text); if (c==EOF) break; if (isalpha(c)) i++; } return i; } int intzahl(FILE *text) { int i, c; i=0; while(1) { c = fgetc(text); if (c==EOF) break; if (isdigit(c)) i++; } return i; } int grosscharzahl(FILE *text) { int i, c; i=0; while(1) { c = fgetc(text); if (c==EOF) break; if (isupper(c)) i++; } return i; } 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+"); printf("%d Argumente festgestellt.\n", argc); for ( i = 0; i < argc; i++ ) { printf("%s\n", argv[i]); } if (datei == NULL) { printf("Fehler beim Einlesen der Lesedatei"); return 1; } else printf("Erfolg beim Einlesen der Lesedatei!\n\n"); if (datei == NULL) { printf("Fehler beim Einlesen der Speicherdatei"); return 1; } else printf("Erfolg beim Einlesen der Speicherdatei!\n\n"); fprintf(stdout, "Die Datei besitzt %i Zeichen ", zeichenzahl(datei)); fseek(datei, 0l, SEEK_SET); fprintf(stdout, "und %i Zeilen.\n", umbruchzahl(datei)); fseek(datei, 0l, SEEK_SET); fprintf(stdout, "Die Zeichen gliedern sich in %i Buchstaben, ", charzahl(datei)); fseek(datei, 0l, SEEK_SET); fprintf(stdout, "%i Ziffern und ", intzahl(datei)); fseek(datei, 0l, SEEK_SET); fprintf(stdout, "und %i Zeilenumbrueche.\n", umbruchzahl(datei)-1); fseek(datei, 0l, SEEK_SET); fprintf(stdout, "Alle Buchstaben wurden, nach Moeglichkeit, in Grossbuchstaben umgewandelt.\n%i Buchstaben waren bereits gross geschrieben und wurden daher nicht umgewandelt.", grosscharzahl(datei)); speichern(datei , speicher); fclose(datei); fclose(speicher); return 0; }
-
füge vor dem speichern( datei, speicher);
ein
rewind( datei );
ein.
Dann läufts..Edit:
Und deine 2.
if (datei == NULL) {
muss
if (speicher == NULL {
heißen.
-
Alles klar, danke funktioniert.
Aber warum das rewind? Der Befehl ist mir neu.
Tut fseek hier seine Sache nicht oder wie?
-
rewind setzt die Position auf den Beginn der Datei.
-
Hmm, offensichtlich scheint fseek nicht so zu klappen, wie du meinst.
When using fseek on text files with offset values other than zero or values retrieved with ftell, bear in mind that on some platforms some format transformations occur with text files which can lead to unexpected repositioning.
Ich arbeite immer mit rewind, um die Datei auch wirklich zurückzuspulen.
-
Okay, wieder was gelernt.
Ich danke für eure Hilfe
-
HighLigerBiMBam schrieb:
Oder so? "prog.exe pfad\datei.bla" Ganz falsch!
Warum soll das denn falsch sein? Das ist doch einfacher Text. Da geht doch der Compiler nicht mehr drüber und ersetzt die Escapesequenzen.
-
Uff... Ich könnte schwören, dass es letztens nicht ging... Was für Drogen hab ich an dem Tag genommen?
Egal, funktioniert \ und \\ ... (heute lol)