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



  • 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!



  • daddy_felix schrieb:

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

    Ich will halt über den Datentyp String das Alphabet ausgeben.



  • silent_max schrieb:

    Wo liegt mein Denkfehler??

    Du vergisst immer wieder, dass char was anderes ist als char[] / char* und auch was anderes ist als std::string .
    Diese drei Typen sind unterschiedlich zu behandeln.



  • DirkB schrieb:

    Diese drei Typen sind unterschiedlich zu behandeln.

    Wie muss ich denn String behandeln, damit ich über String das Alphabet ausgeben kann?



  • silent_max schrieb:

    Wie muss ich denn String behandeln, damit ich über String das Alphabet ausgeben kann?

    gar nicht. das machst du mit "char".



  • daddy_felix schrieb:

    gar nicht. das machst du mit "char".

    Ok.


Anmelden zum Antworten