Getline



  • @manni66 ??? ähhh wie bitte wo soll der sein?



  • @Kote Code markieren und auf </> (neben der Dropdownbox) klicken. Du kannst auch deinen alten Beitrag editieren.



  • @Schlangenmensch

    #include <iostream>
    #include <string>
    #include<locale>
    #include<list>
    #include<algorithm>
    #include<utility>
    #include<map>
    #include<fstream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    
    
    //--------------------------------------------------- Initialisierung------------------------------
    
    int ad = 0;
    int ein = 1;
    int i = 1;
    string aus ="";
    string suchen = "";
    string Dateiname = "Alles";
    map<string, double> Produckte;
    list<string>Products(0);
    
    //--------------------------------------------------- Abfrage ob Admin----------------------------
    
    int Admin() {
    	// Abfrage ob ein admin oder nicht
    	char Admin = 'n';
    	cout << "Sind sie ein Admin?\nSo geben Sie j ein!	";
    	cin >> Admin;
    	if (Admin == 'j') {
    		return Admin;
    	}
    }
    
    //--------------------------------------------------- Admin Bereich ------------------------------
    
    int Producktpalette() {
    
    	locale loc("");
    	locale::global(loc);
    
    	int AnzahlProduckte = 0;
    	int n = 1;				//Zähler wie viele Produckte schon implementiert wurden	
    	//--------------------------------------------------- Abfrage wie viele Produckte im sortiment sind------------------------------
    
    	while (1) {
    		cout <<endl<< "Wie viele Produckte möchten Sie in ihr Sortiment hinzufügen?\nBitte geben Sie die Zahl in Mathematischer form ein.		";
    		cin >> AnzahlProduckte;
    		if (cin.good())
    			break;
    		else
    		{
    			cin.clear();
    			while (cin.get() != '\n');
    			AnzahlProduckte = 0;
    			cout << "Keine gültige Eingabe.";
    		}
    	}
    
    	//--------------------------------------------------- zum erstellen der Produckte------------------------------
    
    	string Name = "";
    	double Preis = 0;
    	while ((i == 1) & (n <= AnzahlProduckte)) {
    
    		cout << endl<< "Geben Sie den Namen des Produckts ein.		";
    
    
    		getline (cin, Name);
    
    
    		cout <<endl<< "Geben Sie den Preis des Produckts ein.		";
    		cin >> Preis;
    		if (cin.good())
    		{
    			Produckte[Name] = Preis;
    			n++;
    			list<string>::iterator it;
    			it = find(Products.begin(), Products.end(), Name);
    			if (it != Products.end());
    			else {
    				Products.push_back(Name);
    			}
    		}
    		else
    		{
    			cin.clear();
    			while (cin.get() != '\n');
    			Preis = 0;
    			cout << endl << "Keine gültige eingabe.";
    		}
    
    	}
    
    	//--------------------------------------------------- Ausgabe aller Produckte------------------------------
    
    	int o = 1;
    	cout <<endl<< "Nr.	Produckt		Preis" << endl;
    	for (auto it = Products.begin(); it != Products.end(); it++) {
    		cout << o;
    		o++;
    		auto ot = Produckte.find(*it);
    		cout << ".	" << *it << "			" << ot->second << "Euro" << endl;
    	}
    
    	string entfernen = "";
    	string test = "";
    
    	//--------------------------------------------------- Produckt entfernen------------------------------
    
    	cout <<endl<< "Wollen Sie ein Produckt entfernen?\nSo geben Sie j ein!	";
    	cin >> entfernen;
    	
    	while (entfernen == "j")
    	{
    		cout << endl;
    		cout << "Wie heist das zu entfernene Produckt?\n";
    		cin >> test;
    		Produckte.erase(test);
    		Products.remove(test);
    		cout << "Wollen Sie ein weiteres Produckt entfernen?\nSo geben Sie j ein!	";
    		cin >> entfernen;
    	}
    
    	//--------------------------------------------------- Ausgabe aller Produckte------------------------------
    	if (entfernen == "j") {
    		int g = 1;
    		cout << endl << "Nr.	Produckt		Preis" << endl;
    		for (auto it = Products.begin(); it != Products.end(); it++) {
    			cout << g;
    			g++;
    			auto ot = Produckte.find(*it);
    			cout << ".	" << *it << "			" << ot->second << " Euro" << endl;
    		}
    	}
    	
    	//--------------------------------------------------- Speichern der Produckte------------------------------
    	ofstream versuch;
    	versuch.open(Dateiname.c_str(),2);
    	if (versuch.is_open())
    	{
    		for (auto it = Products.begin(); it != Products.end(); it++) {
    			auto ot = Produckte.find(*it);
    			versuch << *it << "|" << ot->second << endl;
    		}
    		versuch.close();
    	}
    	else
    	{
    		cout << endl << "Es ist nicht möglich das File zu öffnen" << endl;
    	}
    
    	//--------------------------------------------------- Einlesen der gespeicherten Produckte------------------------------
    	return 0;
    	
    
    }
    
    void Bediener() {
    	
    	//--------------------------------------------------- Suchfunktion nach einem Produckt------------------------------
    	
    	string Suchwort = "";
    	string ja = "";
    	while (1)
    	{
    		cout << endl << "Zu welchem Produckt wollen Sie den Preis finden?\n\nProduckt:		";
    		cin >> Suchwort;
    		auto it = Produckte.find(Suchwort);
    		if (it != Produckte.end()) {
    			cout << "Das Produckt kostet:	";
    			cout << it->second <<  " Euro" << endl;
    		}
    		else {
    			cout << endl << "Kein Eintrag für " << Suchwort << endl;
    		}
    
    		cout <<endl<< "Wollen sie die suche beenden?		";
    		cin >> ja;
    		if (ja == "j")
    			break;
    	}
    
    }
    
    
    int main() {
    
    	locale loc("");
    	locale::global(loc);
    	
    	ifstream versuch;
    	char eingelesen1[100];
    	char eingelesen[100];
    	versuch.open(Dateiname.c_str(), 2);
    
    	if (versuch.is_open())
    	{
    		while (!versuch.eof())
    		{
    			versuch.get(eingelesen1, 100, '|');
    			versuch.getline(eingelesen, 100);
    			string y = eingelesen;
    			y.erase(0,1);
    			if (y == "") {
    				break;
    			}
    			double x = atof (y.c_str()) ;
    			Produckte[eingelesen1] = x;
    			list<string>::iterator it;
    			it = find(Products.begin(), Products.end(), eingelesen1);
    			if (it != Products.end());
    			else {
    				Products.push_back(eingelesen1);
    			}
    		}
    
    		cout << "Ihre Produckte" << endl;
    		int g = 1;
    		cout << endl << "Nr.	Produckt		Preis" << endl;
    		for (auto it = Products.begin(); it != Products.end(); it++) {
    			cout << g;
    			g++;
    			auto ot = Produckte.find(*it);
    			cout << ".	" << *it << "			" << ot->second << " Euro" << endl;
    		}
    	}
    	else
    	{
    		cout << endl << "Erstellen Sie im Adminbereich eine Producktpallette" << endl;
    
    	}
    
    	while (1) {
    		ad = Admin();
    		if (ad == 'j')
    		{
    			Producktpalette();
    		}
    		cout << endl << "Wollen Sie nach einem Produckt suchen?\nSo geben Sie j ein!	";
    		cin >> suchen;
    		if (suchen == "j")
    			Bediener();
    
    		cout <<endl<< "Wollen Sie das Programm beenden?	";
    		cin >> aus;
    		if (aus == "j")
    			break;
    	}
    
    
    	return 0;
    
    
    
    }
    


  • @Kote Schon ne ahnung was schief läuft?



  • Das kompiliert bei dir so?
    Bei versuch.open(Dateiname.c_str(),2); beschwert sich mein Compiler, der will da ein ios_base::openmodealso z.B. ios_base::out haben.

    Deine Funktion "Admin()" gibt nicht für jeden Pfad ein return Wert zurück und warum willst du einen int zurück geben und keinen char?

    Ausprobieren ist schwer, weil ich keine entsprechenden Dateien habe, die du da öffnen und einlesen möchtest. Daher war die bitte im Edit auch es schon minimal zu halten, so, dass es kompiliert, man den Code auführen kann, den Fehler reproduzieren, aber alles was dafür nicht nötig ist, weg ist.

    Prinzipiell sollte das getline Konstrukt aber funktionieren.



  • @Schlangenmensch

    Hi bei mir funzt es Problemlos habs auch behoben ka wie aba i hab das davor getan.

    cin.clear();
    while (cin.get() != '\n');
    std::getline(std::cin, Name);
    


  • Nicht zu Wissen, warum etwas funktioniert ist nie gut, wenn's ums Programmieren geht.
    cin.clear() setzt das Fehlerbit zurück und dann holst du alle Zeichen bis zum Zeilenumbruch, die noch im Stream stehen. Kann natürlich sein, dass da was steht, was du dann liest und die Eingabe, die du eigentlich lesen möchtest erst danach im Stream steht.



  • @Kote Diese ganzen Eingaben mit 'j lesen nur ein Zeichen ein. Danach bleibt noch das '\n' von der Entertaste im Eingabestrom stehen.
    Da ist ein folgendes getline dann gleich fertig.



  • Danke wart echt ne hilfe



  • @Kote Noch kurze Anmerkunden:

    Das hier

    		while (!versuch.eof())
    		{
    			versuch.get(eingelesen1, 100, '|');
    			versuch.getline(eingelesen, 100);
    

    ist in der Regel nicht sinnvoll. Das eof-Flag wird erst gesetzt, NACHDEM ein vorheriger Leseversuch wegen Dateiende gescheitet ist.

    Daher verwendet man in der Regel eine while-Schleife der Art

    while (getline(instream, stringvariable)) { ... }
    

    getline liefert den Stream zurück und dieser wird durch das while als boolean interpretiert. Lies: solange aus dem Stream in stringvariable eingelesen werden konnte, mache ...

    Noch ein genereller Rat: vermeide globale Variablen! Dein gesamter Abschnitt "Initialisierung" sollte möglichst verschwinden. Übergib stattdessen Parameter.

    Noch ein Hinweis: Produkt ist ohne c (nicht: Produckt)


Log in to reply