Mehrere Stringbeispiele von c++ reference funktionieren nicht...



  • Hallo und guten Abend liebe Gemeinde.

    Ich habe einmal mehrere Codebeispiele von c++ reference bzgl. put(char), get(), istream& read(), usw. nachgeschlagen. Ich habe dann auch die ganzen Beispiele zu einer Codedatei zusammengefasst.

    Hier der Code:

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<stdio.h>
    #include<fstream>
    using namespace std;
    
    int main()
    {
    	int number;
    
    	do
    	{
    
    		cout << "\tFunktionen bzgl. String im Ueberblick!\n";
    		cout << "\n";
    		cout << "---------------------------------------------------------\n";
    		cout << "(1) Die Funktion ostream& put(char)\n";
    		cout << "(2) Die Funktion get()\n";
    		cout << "(3) Die Funktion istream& getline()\n";
    		cout << "(4) Die Funktion istream& read()\n";
    		cout << "(5) Die Funktion peek()\n";
    		cout << "(6) Die Funktion istream& putback()\n";
    		cout << "(0) Exit\n";
    		cin  >> number;
    
    		switch(number)
    		{
    		case 1: 
    			{
    				char c;
    				for (c = 'a'; c<='z'; c++) putchar(c);
    				for (c = 'A'; c<='Z'; c++) putchar(c);
    
    				break;
    			}
    
    		case 2:
    			{
    				char c, str[256];
    				ifstream is;
    
    				cout << "Geben Sie den Namen der existierenden Textdatei ein:";
    				cin.get(str,256);
    
    				is.open(str);
    
    				while(is.good())
    				{
    					c = is.get();
    					if(is.good())
    						cout << c;
    				}
    
    				is.close();
    
    				break;
    			}
    		case 3:
    			{
    				char name[256], titel[256];
    
    				cout << "Geben Sie Ihren Namen ein:";
    				cin.getline(name,256);
    
    				cout << "Geben Sie Ihren Lieblingsfilm ein:";
    				cin.getline(titel,256);
    
    				cout << name << "´s Lieblingsfilm ist " << titel << "\n";
    
    				break;
    			}
    		case 4:
    			{
    				  int length;
    				  char * buffer;
    
    				  ifstream is;
    				  is.open ("test.txt", ios::binary );
    
    				  // get length of file:
    				  is.seekg (0, ios::end);
                      length = is.tellg();
    				  is.seekg (0, ios::beg);
    
    				 // allocate memory:
    				 buffer = new char [length];
    
    				 // read data as a block:
    				 is.read (buffer,length);
    				 is.close();
    
    				 cout.write (buffer,length);
    
    				 delete[] buffer;
    			}
    		case 5: 
    			{
    				char c;
    				int n;
    				char str[256];
    
    				cout << "Geben Sie eine Nummer oder ein Wort ein:";
    				c=cin.peek();
    
    				if((c >='0') && (c <='9'))
    				{
    					cin  >> n;
    					cout << "Sie haben eingegeben Nummer " << n << endl;
    				}
    				else
    				{
    					cin  >> str;
    					cout << "Sie haben eingegeben Wort " << str << endl;
    				}
    				break;
    			}
    		case 6:
    			{
    				char c;
    				int n;
    				char str[256];
    
    				cout << "Geben Sie eine Zahl oder ein Wort ein:";
    				c = cin.get();
    
    				if((c>='0')&&(c<='9'))
    				{
    					cin.putback(c);
    					cin  >> n;
    					cout << "Sie haben eingegeben Nummer " << n << endl;
    				}
    				else
    				{
    					cin.putback(c);
    					cin  >> str;
    					cout << "Sie haben eingegeben Wort " << str << endl;
    				}
    				break;
    			}
    		case 0:
    			{
    				cout << "Exit durch Abbruch!" << endl;
    				break;
    			}
    		}
    	}while(number!=0);
    
    	return 0;
    }
    

    Die Menüübersicht und Menüpunkt 1 sind so ziemlich die einzigsten Sachen, die hinhauen. Das ganze andere haut nicht hin und ich weiß nicht, wo der Fehler ist...

    Könnte jemand von euch bitte drüber schauen?

    Danke dafür und für die Antworten im Voraus.

    Gruß

    Max



  • Bitte korrigiere ersteinmal den [cpp} - Fehler...

    Und dann solltest du noch schreiben, was genau nicht funktioniert!


  • Mod

    silent_max schrieb:

    Ich habe einmal mehrere Codebeispiele von c++ reference bzgl. put(char), get(), istream& read(), usw. nachgeschlagen. Ich habe dann auch die ganzen Beispiele zu einer Codedatei zusammengefasst.

    Mit anderen Worten: Du hast (mal wieder) Codefetzen aus dem Internet zusammenkopiert, ohne sie zu verstehen, und suchst die Schuld für das Nichtfunktionieren beim Ursprungscode und nicht bei deiner Methode.



  • SeppJ schrieb:

    und suchst die Schuld für das Nichtfunktionieren beim Ursprungscode und nicht bei deiner Methode.

    Ähh, nö, wo denn?


  • Mod

    Belli schrieb:

    SeppJ schrieb:

    und suchst die Schuld für das Nichtfunktionieren beim Ursprungscode und nicht bei deiner Methode.

    Ähh, nö, wo denn?

    Die Überschrift klingt so, als würde er annehmen, es liege an den Beispielen.



  • Im Skript von meinem Lehrer stehen ja die Funktionen ohne den Beispielen...

    Auf C++ Reference sind wenigstens Beispiele aufgeführt ... und ich suche nicht die Schuld an den Beispielen...



  • Th69 schrieb:

    Bitte korrigiere ersteinmal den [cpp} - Fehler...

    Und dann solltest du noch schreiben, was genau nicht funktioniert!

    Menüpunkt 1 funktioniert einwandfrei.
    Menüpunkt 2 ist eine Endlosschleife
    Bei Menüpunkt 3 kann ich nur den Lieblingsfilm eingeben.
    Bei Menüpunkt 4 bricht das Programm ab mit der Meldung Invalid allocation size: 4294967395 bytes
    Bei Menüpunkt 5 kommt immer "Sie haben eingegeben Wort: ", auch wenn ich Zahlen eingegeben habe
    und bei Menüpunkt 6 ist es das gleiche wie bei Menüpunkt 5



  • Include <limits> und füge cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); nach Zeile 25 ein...
    Und es sollte #include <cstdio> heißen nicht stdio.h.



  • Nathan schrieb:

    Include <limits> und füge cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); nach Zeile 25 ein...
    Und es sollte #include <cstdio> heißen nicht stdio.h.

    Menüpunkt 2, 3 und 6 funktionieren jetzt, aber 4 nicht und nun ist Menüpunkt 5 eine Endlosschleife...

    Ich schau es mir morgen noch einmal genauer an...



  • Lediglich zwei Dinge:

    if (!is)
    {
        // Fehlermeldung ausgeben weil, File nicht vorhanden
    }
    

    Einfügen in Zeile 80 oder das so machen wie bei Menüpunkt 3.
    Und ein break in Zeile 95 einfügen, weil sonst die Schleife direkt zu fünf wechselt.
    Punkt 6 funktioniert bei mir.



  • statt

    char name[256];
    cin.getline(name, 256);
    

    lieber

    std::string name;
    getline(cin, name);
    

    das spart dir auch einiges



  • Also ich habe mir mal die Arbeit gemacht und habe das komplette Programm in kleine Einzelprogramme geschrieben. Ich hoffe, dass ich die einzelnen Funktionen richtig verstanden habe.
    --------------------------------------------------------------------------------
    1.) Funktion put(char)

    Die Funktion gehört zur Standardausgabe. Sie schreibt einen Buchstaben zur Standardausgabe.

    Beispiel:

    #include<iostream>
    #include<cstdio>
    
    int main()
    {
    	char c;
    
    	for (c = 'a'; c<='z'; c++) putchar(c);
    	for (c = 'A'; c<='Z'; c++) putchar(c);
    
    	return 0;
    }
    

    -------------------------------------------------------------------------------
    2.) Die Funktion get()
    Die Funktion get() ist eine öffentliche Elementfunktion, die zur Standarteingabe gehört und führt unformatierte Eingabefunktionen aus.

    Beispiel:

    #include<iostream>
    #include<fstream>
    using namespace std;
    
    int main()
    {
    	char c, str[256];
    	ifstream is;
    
    	cout << "Geben Sie den Namen der existierenden Datei ein!\n";
    	cin.get(str,256);
    
    	is.open(str);
    
    	while(is.good())
    	{
    		c = is.get();
    		if(is.good())
    		cout << c;
    	}
    
    	is.close();
    
    	return 0;
    }
    

    ------------------------------------------------------------------------------
    3.) Die Funktion getline()
    Die Funktion getline() gehört zur Standarteingabe. Sie entnimmt Buchstaben von is und speichert diese in einem String bis ein Begrenzungsbuchstabe gefunden ist. Im Beispiel ist der Begrenzungsbuchstabe '\n'

    Beispiel:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	char name[256], titel[256];
    
    	cout << "Geben Sie Ihren Namen ein:";
    	cin.getline(name,256);
    
    	cout << "Geben Sie Ihren Lieblingsfilm ein:";
    	cin.getline(titel,256);
    
    	cout << name << "´s Lieblingsfilm ist " << titel << "\n";
    
    	return 0;
    }
    

    ------------------------------------------------------------------------------
    4.) Die Funktion get()
    Sie gehört zur Standarteingabe. Liest einen Block von Daten von n Buchstaben und speichert es gezeigt bei s.

    Beispiel:

    #include<iostream>
    #include<fstream>
    using namespace std;
    
    int main()
    {
    		int length;
    		char * buffer;
    
    		ifstream is;
    		is.open ("test.txt", ios::binary );
    
    		// bekommt Länge einer Datei
    		is.seekg (0, ios::end);
            length = is.tellg();
    		is.seekg (0, ios::beg);
    
    		// ordnet Speicher zu
    		buffer = new char [length];
    
    		// liest Daten als einen Block
    		is.read (buffer,length);
    		is.close();
    
    		cout.write (buffer,length);
    
    		delete[] buffer;
    
    		return 0;
    }
    

    Hier bekomme ich die Fehlermeldung:
    Invalid allocation size: 4294967295 bytes.
    Zwar weiß ich inzwischen, dass es mit einer ungültigen Zuordnungsgröße zu tun hat, aber ich weiß nicht woher und auch nicht warum.
    ------------------------------------------------------------------------------
    5.) Die Funktion peek()
    Die Funktion peek() gehört zur Standartausgabe. Sie liest Buchstaben ein und gibt den nächsten Buchstaben aus, ohne ihn zu extrahieren.

    Beispiel:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	char c;
    	int n;
    	char str[256];
    
    	cout << "Geben Sie eine Nummer oder ein Wort ein:";
    	c=cin.peek();
    
    	if((c >='0') && (c <='9'))
    	{
    		cin  >> n;
    		cout << "Sie haben eingegeben Nummer " << n << endl;
    	}
    	else
    	{
    		cin  >> str;
    		cout << "Sie haben eingegeben Wort " << str << endl;
    	}
    	return 0;
    }
    

    -------------------------------------------------------------------------------
    6.) Die Funktion putback()
    Gehört zur Standarteingabe. Dekrementiert deen internen get pointer um 1 und wird der Buchstabe, der als nächstes gelesen wird.

    Beispiel:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	char c;
    	int n;
    	char str[256];
    
    	cout << "Geben Sie eine Zahl oder ein Wort ein:";
    	c = cin.get();
    
    	if((c>='0')&&(c<='9'))
    	{
    		cin.putback(c);
    		cin  >> n;
    		cout << "Sie haben eine Nummer eingegeben " << n << endl;
    	}
    	else
    	{
    		cin.putback(c);
    		cin  >> str;
    		cout << "Sie haben ein Wort eingegeben " << str << endl;
    	}
    
    	return 0;
    }
    

    -------------------------------------------------------------------------------

    Ich hoffe, dass ich es richtig verstanden habe???

    Gruß

    Max



  • Nein.

    Der Fehler bei deinem 4. Beispiel kommt daher, dass tellg() im Fehlerfall die -1 zurückgibt. Beim Erzeugen deines Arrays wird diese -1(int) zu einem unsigned int gecastet. Das ergibt die 4,2 Mrd., was genau 2^32 -1 ergibt. In Bytes sind das genau 4 Gigabyte. Und das gibt dir dein Computer/Betriebsystem nicht her -> daher exception von wegen bad_alloc, sprich Fehler.



  • Du bist dir ein bisschen unschlüssig wie Standard geschrieben wird.

    Es geht dabei nicht um die Art und weise wie du stehst. Standarteingabe



  • silent_max schrieb:

    1.) Funktion put(char)

    Die Funktion gehört zur Standardausgabe. Sie schreibt einen Buchstaben zur Standardausgabe.

    Beispiel:

    #include<iostream>
    #include<cstdio>
    
    int main()
    {
    	char c;
    
    	for (c = 'a'; c<='z'; c++) putchar(c);
    	for (c = 'A'; c<='Z'; c++) putchar(c);
    
    	return 0;
    }
    

    Ich denk es geht um put(), wieso benutzt du putchar()?



  • Versuch mal das. 😉

    #include<iostream>
    #include<fstream>
    using namespace std;
    
    int main()
    {
            int length;
            char * buffer;
    
            ifstream is;
            is.open ("test.txt", ios::binary );
            if(!is)
            {
                std::cout << "test.txt ist leider nicht erreichbar; Versuchen sie es spaeter wieder!\n";
                return 1;
            }
    
            // bekommt Länge einer Datei
            is.seekg (0, ios::end);
            length = is.tellg();
            is.seekg (0, ios::beg);
    
            // ordnet Speicher zu
            buffer = new char [length];
    
            // liest Daten als einen Block
            is.read (buffer,length);
            is.close();
    
            cout.write (buffer,length);
    
            delete[] buffer;
    
            return 0;
    }
    


  • Ersteinmal danke für die bisherigen Antworten.

    Bashar schrieb:

    put(), wieso benutzt du putchar()?

    Ich habe einmal versucht, es über den Datentyp String zu programmieren.

    Hier der Code:

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main()
    {
      string Buchstabe;
    
      for(Buchstabe='a'; Buchstabe<='z'; Buchstabe++)
        cout << Buchstabe;
    
      return 0;
    }
    

    Jedoch bekomme ich bezogen auf die Zeile 9 folgende Fehlermeldungen:

    Error: Kein "<=" - Operator stimmt mit diesen Operanden überein.
    Error: Kein "++" - Operator stimmt mit diesen Operanden überein.
    

    Wo liegt mein Denkfehler??

    Gruß

    Max



  • silent_max schrieb:

    Wo liegt mein Denkfehler??

    was sollte denn herauskommen, wenn du einen std::string inkrementierst?

    std::string text = "Hallo";
    text++;
    cout << text;  // was sollte hier stehen?
    


  • silent_max schrieb:

    Wo liegt mein Denkfehler??

    Du benutzt (bzw. versuchst es), Operatoren auf einem std::string zu benutzen, die für diesen nicht definiert sind.

    Sagt doch die Fehlermeldung ganz deutlich!



  • daddy_felix schrieb:

    silent_max schrieb:

    Wo liegt mein Denkfehler??

    was sollte denn herauskommen, wenn du einen std::string inkrementierst?

    std::string text = "Hallo";
    text++;
    cout << text;  // was sollte hier stehen?
    

    Welt!


Anmelden zum Antworten