kirchi123 Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Ich würde gerne ein Programm schreiben, das die Anzahl der Zeichen in einer Datei zählt. Der Dateiname soll als Parameter übergeben werden. Ich hab das Programm so geschrieben: #include <iostream> #include <string.h> #include <fstream> #include <cstdlib> using namespace std; static void usage (char *porgname) { cout << " Parameter nicht korrekt "; exit(1); } static void error (char *progname, char **errorMessage) { cout << " ERROR in " << " ue5.C " << errorMessage << endl; exit(1); } int main (int argc, char *argv[]) { cout << endl; cout << endl; FILE *datei; char zeichen; int zaehler = 0; int n = atoi (argv[1]); datei = fopen("text.txt", "r"); if (argc !=2) { cout << " Fehler "; } datei = fgets(argv[1] != EOF); { zaehler++; } cout << " Die Datei enthält: " << zaehler << " Zeichen "; fclose(datei); } Das Programm funktioniert aber leider nicht. Es kommt immer eine Fehlermeldung. Ich bin noch ein Anfänger in C++. Könnte mir jemand helfen. Vielen Dank im Vorraus. Zitieren
TDM Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Folgendes Beispiel sollte die Größe der Datei eigentlich ermitteln: FILE * pFile; long size; pFile = fopen ("myfile.txt","rb"); if (pFile==NULL) perror ("Error opening file"); else { fseek (pFile, 0, SEEK_END); size=ftell (pFile); fclose (pFile); printf ("Size of myfile.txt: %ld bytes.\n",size); } return 0; Zitieren
Klotzkopp Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Ich würde gerne ein Programm schreiben, das die Anzahl der Zeichen in einer Datei zählt.Sollst du wirklich zählen, oder reicht es, die Größe der Datei zu ermitteln? #include <iostream>Soweit OK. #include <string.h>Die Verwendung der C-Standardheader ist in C++ deprecated. Richtig müsste es <cstring> heißen. Du verwendest allerdings nichts aus diesem Header. #include <fstream>Du verwendest (warum auch immer) die C-Datei-API. Dafür brauchst du nicht <fstream> sondern <cstdio>. Ich würde aber empfehlen, das Programm von fopen auf fstream umzustellen. static void usage (char *porgname) { cout << " Parameter nicht korrekt "; exit(1); }Diese Funktion wird gar nicht benutzt. Und selbst wenn sie benutzt würde, ist der Parameter unnötig. Und warum ist die Funktion static? static void error (char *progname, char **errorMessage) { cout << " ERROR in " << " ue5.C " << errorMessage << endl; exit(1); }Siehe oben, Funktion wird nicht benutzt. Der Parameter progname auch nicht. datei = fgets(argv[1] != EOF);fgets liest Zeilen ein. Das ist nicht sonderlich sinnvoll, wenn du Zeichen zählen willst. Außerdem sollte das wohl eine Schleife sein. Das Programm funktioniert aber leider nicht. Es kommt immer eine Fehlermeldung.Und warum schreibst du nicht, wie die lautet? Warum muss jeder, der dir helfen will, erst selbst das Programm durch einen Compiler jagen? Zitieren
Klotzkopp Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Folgendes Beispiel sollte die Größe der Datei eigentlich ermitteln:Geht so. Bei Textdateien kann das durch die Umwandlung der Zeilenenden daneben gehen. Und Binärdateien müssen fseek ans Ende gar nicht unterstützen. Siehe C-Faq Question 19.12 Aber meistens funktioniert das Zitieren
kirchi123 Geschrieben 24. Juni 2008 Autor Geschrieben 24. Juni 2008 Also ich hab mir mal gedacht ich frag mal ohne die Fehlermeldung dazuzuschreiben, weil vielleicht jemandem schon einfach im Programm was auffällt, aber die Fehlermeldungen lauten: C++ forbids the comparison between pointer and integer. Und dann noch eine zweite: cannot convert 'bool' to 'char*' for argument '1' to char* fgets(char*, int, FILE*). Zitieren
Klotzkopp Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Ja, die Zeile mit fgets ist totaler Blödsinn. Abgesehen davon, dass fgets hier falsch ist, sieht das nach einer Anweisung aus, die eigentlich mal ein Schleifenkopf werden sollte. Auch die Klammerung ist falsch. Zitieren
TDM Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Geht so. Toll, da geb ich mir mühe und du sagst nur "geht so". Naja, theoretisch hätte ich einfach nur immer ein Zeichen bis EOF gelesen, aber ich weiß nicht, ob's vielleicht noch schneller geht. Zitieren
Klotzkopp Geschrieben 24. Juni 2008 Geschrieben 24. Juni 2008 Toll, da geb ich mir mühe und du sagst nur "geht so". :floet: Naja, theoretisch hätte ich einfach nur immer ein Zeichen bis EOF gelesen, aber ich weiß nicht, ob's vielleicht noch schneller geht.Es gibt meist plattformspezifische Alternativen, unter Linux z.B. stat/fstat. Zitieren
kirchi123 Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 Das mit dem öffnen und lesen aus Datei hab ich hinbekommen, hab aber keine Ahnung wie ich das mit dem zählen der Zeichen machen soll. Könnte mir vielleicht jemand eine Anregung geben. Das wäre super. Vielen Dank im Voraus. Zitieren
TDM Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 Könnte mir vielleicht jemand eine Anregung geben. Das wäre super. Vielen Dank im Voraus. TOFU: Zitieren
kirchi123 Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 Danke dafür, aber leider hilft mir das nicht so weiter. Trotzdem danke. Zitieren
Klotzkopp Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 Könnte mir vielleicht jemand eine Anregung geben. while( file.get() ) ++zaehler; Zitieren
kirchi123 Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 Das hab ich jetzt probiert, aber da bekomme ich die Fehlermeldung: request for member 'get' in 'quellDatei', which is of non-class type 'FILE*'. Das bedeutet den das? Den Code hab ich so probiert: while (quellDatei.get() != EOF) { ++zaehler; } Zitieren
Klotzkopp Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 Das bedeutet den das? Das bedeutet, dass du nicht meinem Rat gefolgt bist, das Programm auf fstream umzustellen. Deswegen ist es auch wenig sinnvoll, wenn du nach Anregungen fragst, ohne den aktuellen Code zu zeigen. Dass du das Öffnen und Lesen "hinbekommen" hast, hilft uns nicht weiter, weil wir nicht wissen, wie du es hinbekommen hast. Wenn du bei fopen bleiben willst, solltest du die Funktion fgetc benutzen. Zitieren
kirchi123 Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 Danke hab es hinbekommen. Jetzt hätte ich noch eine Frage: Wie würde das den aussehen wenn ich nicht die Zeichen zählen, sondern nach einem bestimmten Zeichen suchen will. Vielen lieben Dank. Zitieren
Klotzkopp Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 Dann musst du den Rückgabewert von fgetc in einer int-Variablen speichern, damit du sowohl auf dein gesuchtes Zeichen als auch auf EOF prüfen kannst. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.