Benötige Hilfe bei C++ Schulprojekt



  • Nabend,

    wie oben schon gesagt bräuchte ich Hilfe für ein C++ Projekt das wir zur Zeit an der Schule machen.
    Bin vom Programmieren her noch bisl ein Anfänger und auch nicht so der Hammer bzw nicht soo super gut in C++ :/.
    Bei dem Projekt müssen wir eine .txt Datei einlesen und dann ausgeben wieviele Großbuchstaben, Kleinbuchstaben, Sonderzeichen und Zahlen.
    Da bei mir jedes Zeichen aus der .txt Datei einzeln ausgelesen wird das mit if Schleifen immer überprüft wird per ascii code ob es z.B. ein Großbuchstabe oder ein Sonderzeichen ist. Dafür hab ich Variablen deklariert (für Großbuchstaben, Kleinbuchstaben usw. ) die den Wert 0 haben und immer wenn ein Zeichen ausgelesen wird, die jeweilige Variable um eins hochgezählt wird. Nur stimmt die Ausgabe nie und es kommt nur schmarn raus.

    Ich hoff ihr könnt mir weiterhelfen weil ich jetzt schon ewig dran sitz und einfach nicht weiter weiß.

    MfG

    Hier der Code:

    #include <iostream.h>
    #include <iomanip.h>
    #include <stdio.h>
    #include <conio.h>
    void einzeldatei(void);
    void verzeichnis(void);
    
    int main()
    {
     char wahl;
    
     cout<<"Willkommen beim Programm zur Zaehlung der Anschlaege"<<endl
         <<"----------------------------------------------------"<<endl<<endl;
    
     //Eingabeaufforderung/Auswahl
     cout<<"Bitte waehlen Sie was Sie machen wollen :"<<endl<<endl
         <<"       <A> Eine Einzelne Datei einlesen."<<endl
         <<"       <B> Ein ganzes Verzeichnis einlesen."<<endl<<endl;
    
     cin>>wahl;
     clrscr();
     cout<<"Der eingegebene Text lautet:"<<endl
         <<"----------------------------"<<endl<<endl;
     switch (wahl)
     {
      case 'a':
      case 'A': einzeldatei();
                break;
    
      case 'b':
      case 'B': verzeichnis();
                break;
    
     }
    
     getchar();
    }
    
    void einzeldatei(void)
    {
     int grossb=0, zahl=0, sonderz=0, kleinb=0,
         len;
    
     char buf[50];
    
     FILE *datei;
     datei = fopen ("C:\\ctest.txt","r");
     len=strlen(buf);
     for (int i=0; i<len; i++)
     {
     fread(&buf[i], 1, 1, datei);
    
     if (buf[i]>=65 && buf[i]<=90)
      {
      grossb++;
      }
    
     if (buf[i]>=48 && buf[i]<=57)
      {
      zahl++;
      }
    
     if (buf[i]>=123 && buf[i]<=255)
      {
      sonderz++;
      }
    
     if (buf[i]>=97 && buf[i]<=122)
      {
      kleinb++;
      }
    
     cout<<buf[i]<<endl<<endl;
     cout<<grossb<<endl;
     cout<<kleinb<<endl;
     cout<<zahl<<endl;
     cout<<sonderz;
    
     }
    
     fflush(stdout);
     fclose(datei);
    }
    
    void verzeichnis(void)
    {
    
    }
    


  • aaalllso, 1. verwende anstatt fopen, fread, fwirte die fstream-Klasse

    ifstream datei("name.txt");

    char buf[50];
    
     FILE *datei;
     datei = fopen ("C:\\ctest.txt","r");
     len=strlen(buf);  // len ist hier irgendwas... ich denke mal, 
    //du willst die datei ganz auslesen bis zu ende, dann mach das anders
     for (int i=0; i<len; i++)
     {
     fread(&buf[i], 1, 1, datei);
    
    while(!datei.eof())
    {...
    }
    

    das is aber ein schmutziger weg, das mit eof stimmt noch nicht ganz so, schau in die faq zu ofstream oder fstream, da steht wie man es beser macht.



  • #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char **argv)
    {
      ifstream file("text.txt");
      char buff;
      int klein=0,gross=0,zahl=0,sonder=0;
      while(file.get(buff))
      {
         if(buff>=65 && buff<=90) gross++;
         else if(buff>=97 && buff<=122) klein++;
         else if(buff>=48 && buff<=57) zahl++;
         else sonder++;
      }
      file.close();
      cout<< "Grossbuchstaben:" << gross <<endl;
      cout<< "Kleinbuchstaben:" << klein <<endl;
      cout<< "Zahlen:" << zahl <<endl;
      cout<< "Sonderzeichen:" <<sonder;
    }
    


  • Ein Problem am Originalcode ist, dass srtlen() falsche Werte liefert, da buf nicht Nullterminiert ist. Ausserdem stimmt da jede Menge nicht. Was passiert, wenn die Datei mehr als 50 Zeichen enthaelt? Warum ueberhaupt 50? Warum nicht nur eins, wenn Du schon einzeln einliest? Und warum nicht bis zum EOF einlesen?

    Fragen ueber Fragen 🙂



  • "if schleifen" AAAAAAAAAAAAAAH



  • ssdg schrieb:

    "if schleifen" AAAAAAAAAAAAAAH

    http://www.if-schleife.de/ 🕶



  • thx für eure hilfe !! 🙂 jetzt klappts endlich und wir können weiter dran arbeiten echt big thx !!


Anmelden zum Antworten