Daten aus Datei lesen funktioniert nicht



  • Moin, ich habe bei meinem Programm ein kleines Problem.
    Es handelt sich nur um ein kleines Programm mit einer do while Schleife bei welcher man verschiedene Auswahlmöglichkeiten hat: zufällige Zahlen generieren, Mittelwert berechnen, Min/Max rausfinden, die zuletzt generierten Zahlen in eine Datei schreiben, Die Zahlen aus der Datei einlesen.
    Nun geht es aber nicht, dass wenn ich als aller erstes zahlen aus der Datei einlesen möchte. Insgesamt sind es immer 10 zahlen in der Datei, die erste ist auch richtig aber alle anderen sind -858993460. Wenn ich aber als erstes beim Programmstart neue Zahlen generiere und dann beim zweiten Durchlauf die Zahlen aus der Datei einlese geht es wunderbar und die Zahlen sind auch die, die wirklich in der Datei stehen und nicht die, die im Durchlauf vorher generiert wurden.
    Woran liegt das?

    else if (auswahl == 'l')
    		{
    			ifstream read;
    			char zahl_datei;
    			string test12;
    			int i = 0;
    			stringstream sss;
    
    			cout << endl << "Dies sind die Daten aus der Datei 'projekto_zufallszahlen.txt':" << endl << endl;
    			
    			read.open("projekto_zufallszahlen.txt", ios::in);
    
    			while (getline(read, test12))
    			{
    				sss << test12;
    				sss >> Zufallzahlen[i];
    				cout << "Zahl " << i+1 << ":  " << Zufallzahlen[i] << endl;
    				i = i + 1;
    			}
    			
    			read.close();
    
    			
    		}
    

    Lg, Marcel



  • @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Auf Wunsch kann ich gerne den Code zeigen.

    lol



  • @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Woran liegt das?

    An einem Fehler in deinem Programm.

    Auf Wunsch kann ich gerne den Code zeigen.

    Was meinst du, wie sinnvoll das ist?



  • @Wutz sagte in Daten aus Datei lesen funktioniert nicht:

    @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Auf Wunsch kann ich gerne den Code zeigen.

    lol

    @DirkB sagte in Daten aus Datei lesen funktioniert nicht:

    @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Woran liegt das?

    An einem Fehler in deinem Programm.

    Auf Wunsch kann ich gerne den Code zeigen.

    Was meinst du, wie sinnvoll das ist?

    Es hätte ja sein können, dass das irgendwie aus Prinzip nicht geht, bzw es da ne allgemeine Lösung gibt
    Hab ihn oben rein editiert



  • @Mxxrcel was ist Zufallzahlen?



  • @DirkB
    Ein Array mit 10 Elementen, in welchem eigentlich die neu generierten Zahlen gespeichert werden. Aber ich dachte es müsse ja auch gehen, wenn man in diesem als direkt die Zahlen aus der Datei speichert.

    Hier einfach nochmal der gesamte Code:

    #include <iostream>
    #include <ctime>
    #include <fstream>
    #include <string>
    #include <Windows.h>
    #include <sstream>
    
    using namespace std;
    
    
    int main()
    {
    	const int max = 10;
    	int Zufallzahlen[max];
    	char auswahl;
    	int zufall, mini, maxi, gesamt;
    	double mittel;
    	
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
    	srand((unsigned)time(0));
       
    	do
    	{
    
    		cout << "Was wollen sie tun?" << endl
    			<< "Zufallszahlen ziehen (z)" << endl
    			<< "Mittelwert berechnen (m)" << endl
    			<< "Minimum und Maximum anzeigen (u)" << endl
    			<< "In eine Datei schreiben (s)" << endl
    			<< "Aus einer Datei lesen (l)" << endl
    			<< "beenden (b)" << endl << endl;
    		cout << "Eingabe: " ;
    		cin >> auswahl;
    
    
    		if (auswahl == 'z')
    		{
    			cout << endl << "Zufallszahlen werden generiert..." << endl;
    
    			for (int i = 0; i < max; i++)
    			{
    				zufall = (rand() % 1000) + 1;
    				Zufallzahlen[i] = zufall;
    				cout << "Zahl " << i + 1 << "\t";
    				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9);
    				cout << Zufallzahlen[i] << endl;
    				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
    			}
    
    			cout << endl;
    		}
    		else if (auswahl == 'm')
    		{
    			cout << endl << "Mittelwert wird berechnet..." << endl << endl;
    			gesamt = 0;
    			for (int i = 0; i < max; i++)
    			{
    				gesamt = gesamt + Zufallzahlen[i];
    			}
    			mittel = gesamt / max;
    			cout << "Der Mittelwert ist: " << mittel << endl << endl;
    		}
    		else if (auswahl == 'u')
    		{
    			cout << endl << "Minimum und Maximum werden analysiert..." << endl << endl;
    			mini = Zufallzahlen[1];
    			maxi = Zufallzahlen[1];
    			for (int i = 0; i < max; i++)
    			{
    				if (mini > Zufallzahlen[i])
    				{
    					mini = Zufallzahlen[i];
    				}
    				else if (maxi < Zufallzahlen[i])
    				{
    					maxi = Zufallzahlen[i];
    				}
    			}
    			cout << "Das Minimum ist: " << mini << endl;
    			cout << "Das Maximum ist: " << maxi << endl;
    		}
    		else if (auswahl == 's')
    		{
    			ofstream write;
    
    			write.open("projekto_zufallszahlen.txt", ios::out);
    
    			for (int i = 0; i < max; i++)
    			{
    				write << Zufallzahlen[i] << endl;
    			}
    
    			write.close();
    
    			cout << endl << "Die Zahlen wurden in die Datei 'projekto_zufallszahlen.txt' geschrieben." << endl << endl;
    		}
    		else if (auswahl == 'l')
    		{
    			ifstream read;
    			char zahl_datei;
    			string test12;
    			int i = 0;
    			stringstream sss;
    
    			cout << endl << "Dies sind die Daten aus der Datei 'projekto_zufallszahlen.txt':" << endl << endl;
    			
    			read.open("projekto_zufallszahlen.txt", ios::in);
    
    			while (getline(read, test12))
    			{
    				sss << test12;
    				sss >> Zufallzahlen[i];
    				cout << "Zahl " << i+1 << ":  " << Zufallzahlen[i] << endl;
    				i = i + 1;
    			}
    			
    			read.close();
    
    			
    		}
    		else if (auswahl == 'b')
    		{
    			return 0;
    		}
    		else
    		{
    			cout << "Falsche Eingabe!" << endl << endl;
    		}
    
    		cout << "________________________________________________________" << endl << endl;
    
    	} while (auswahl != 'b');
    }
    
    


  • Ja ich weiß auch nicht.

    #include <numeric>  // std::iota()
    #include <fstream>
    #include <iostream>
    
    std::size_t constexpr MAX_NUMBERS{ 10 };
    char const *const FILENAME{ "file.txt" };
    
    int main()
    {
    	int numbers[MAX_NUMBERS];
    	std::iota(numbers, numbers + MAX_NUMBERS, 0);
    	std::cout << "Numbers: ";
    	for (auto n : numbers)
    		std::cout << n << ' ';
    	std::cout.put('\n');
    
    	{ // schreiben:
    		std::ofstream os{ FILENAME };
    		if (!os.is_open()) {
    			std::cerr << "Couldn't open \"" << FILENAME << "\" for writing :(\n\n";
    			return EXIT_FAILURE;
    		}
    
    		for (auto n : numbers)
    			os << n << '\n';
    	}
    
    	{ // lesen:
    		std::ifstream is{ FILENAME };
    		if (!is.is_open()) {
    			std::cerr << "Couldn't open \"" << FILENAME << "\" for reading :(\n\n";
    			return EXIT_FAILURE;
    		}
    
    		int numbers_read[MAX_NUMBERS];
    
    		std::size_t num_numbers_read{};
    		while (num_numbers_read < MAX_NUMBERS && is >> numbers_read[num_numbers_read])
    			++num_numbers_read;
    
    		std::cout << "Number of numbers read: " << num_numbers_read << "\nNumbers: ";
    		for (auto n : numbers_read)
    			std::cout << n << '\n';
    		std::cout.put('\n');
    	}
    }
    

    PS: Mach mal ein switch statt der if-else if-Kaskade und pack die eigentliche Funktionalität in Funktionen (duh). So mag das doch keiner lesen.



  • @Mxxrcel Du solltest überprüfen, ob die Datei geöffnet werden konnte.

    Warum der Stringstream?

    Und dein Mittelwert ist immer Ganzzahlig.



  • @DirkB sagte in Daten aus Datei lesen funktioniert nicht:

    @Mxxrcel Du solltest überprüfen, ob die Datei geöffnet werden konnte.

    Warum der Stringstream?

    Und dein Mittelwert ist immer Ganzzahlig.

    Überprüfung der Datei ist positiv, kann also geöffnet werden.

    Habs ohne den stringstream irgendwie nicht hinbekommen.

    Stimmt, danke.



  • @Swordfish sagte in Daten aus Datei lesen funktioniert nicht:

    Ja ich weiß auch nicht.

    #include <numeric>  // std::iota()
    #include <fstream>
    #include <iostream>
    
    std::size_t constexpr MAX_NUMBERS{ 10 };
    char const *const FILENAME{ "file.txt" };
    
    int main()
    {
    	int numbers[MAX_NUMBERS];
    	std::iota(numbers, numbers + MAX_NUMBERS, 0);
    	std::cout << "Numbers: ";
    	for (auto n : numbers)
    		std::cout << n << ' ';
    	std::cout.put('\n');
    
    	{ // schreiben:
    		std::ofstream os{ FILENAME };
    		if (!os.is_open()) {
    			std::cerr << "Couldn't open \"" << FILENAME << "\" for writing :(\n\n";
    			return EXIT_FAILURE;
    		}
    
    		for (auto n : numbers)
    			os << n << '\n';
    	}
    
    	{ // lesen:
    		std::ifstream is{ FILENAME };
    		if (!is.is_open()) {
    			std::cerr << "Couldn't open \"" << FILENAME << "\" for reading :(\n\n";
    			return EXIT_FAILURE;
    		}
    
    		int numbers_read[MAX_NUMBERS];
    
    		std::size_t num_numbers_read{};
    		while (num_numbers_read < MAX_NUMBERS && is >> numbers_read[num_numbers_read])
    			++num_numbers_read);
    
    		std::cout << "Number of numbers read: " << num_numbers_read << "\nNumbers: ";
    		for (auto n : numbers_read)
    			std::cout << n << '\n';
    		std::cout.put('\n');
    	}
    }
    

    PS: Mach mal ein switch statt der if-else if-Kaskade und pack die eigentliche Funktionalität in Funktionen (duh). So mag das doch keiner lesen.

    Kannst du mir deinen Code ggf. ein wenig erklären? Bin noch nicht so weit.

    Und ja switch wäre einfacher, Funtionen hatten wir im Unterricht noch nicht und ich will nicht so weit vorarbeiten.
    Bevor wieder irgendwas in die Richtung kommt von wegen "wir machen hier nicht deine Hausaufgaben": Es sind nicht wirklich Hausaufgaben, wir machen das eigentlich im Unterricht und ich wills mir selber schon erarbeiten weils mich einfach interessiert.



  • @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Kannst du mir deinen Code ggf. ein wenig erklären?

    Wäre einfacher wenn Du Fragen stellst.



  • @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Habs ohne den stringstream irgendwie nicht hinbekommen.

    Das geht so:

    ifstream read("projekto_zufallszahlen.txt");
    
    int i = 0;
    while (i < max && read >> Zufallszahlen[i])
    {
    	cout << "Zahl " << i+1 << ": " << Zufallzahlen[i] << endl;
    	++i;
    }
    

    @Swordfish hat den Code nur mit eigenen Variablennamen umgeschrieben (und in Zeile 39 einen Syntaxfehler eingebaut ;-).



  • @Th69 sagte in Daten aus Datei lesen funktioniert nicht:

    @Swordfish hat den Code nur mit eigenen Variablennamen umgeschrieben (und in Zeile 39 einen Syntaxfehler eingebaut ;-).

    Das war ein Smiley 😠



  • @Th69 sagte in Daten aus Datei lesen funktioniert nicht:

    @Mxxrcel sagte in Daten aus Datei lesen funktioniert nicht:

    Habs ohne den stringstream irgendwie nicht hinbekommen.

    Das geht so:

    ifstream read("projekto_zufallszahlen.txt");
    
    int i = 0;
    while (i < max && read >> Zufallszahlen[i])
    {
    	cout << "Zahl " << i+1 << ": " << Zufallzahlen[i] << endl;
    	++i;
    }
    

    @Swordfish hat den Code nur mit eigenen Variablennamen umgeschrieben (und in Zeile 39 einen Syntaxfehler eingebaut ;-).

    So funktioniert alles perfekt, danke dir : )


Anmelden zum Antworten