Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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;

Geschrieben
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?
Geschrieben

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*).

Geschrieben

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.

Geschrieben
Geht so.

Toll, da geb ich mir mühe und du sagst nur "geht so". :D

Naja, theoretisch hätte ich einfach nur immer ein Zeichen bis EOF gelesen, aber ich weiß nicht, ob's vielleicht noch schneller geht.

Geschrieben
Toll, da geb ich mir mühe und du sagst nur "geht so". :D
: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.
Geschrieben

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.

Geschrieben

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;

}

Geschrieben
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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...