Quicksorttest: Fehler beim einlesen der Werte in ein Pointerarray



  • Hallo liebe Fangemeinde...

    ich habe folgendes Problem. Ich habe ein Programm geschrieben, welches den Quicksort teste soll! Dabei erstelle ich Zufallswerte die ich in eine datei schreibe und dann in ein array kopiere. Allerdings klappt das schreiben ins Array nicht die Funktion "datei_einlesen(_range, _file, &a);" bricht bei mir ab, nachdem es 50 Werte eingelesen hat! Ich weiß leider net woran der Fehler liegt!
    Könntet mir jemanden weiter helfen? Habe ich was generell falsch gemacht?
    Ich möchte gern bis zu 1.000.000 Werte sortieren können!

    #include <iostream>
    #include <stdlib.h>
    #include <fstream>
    #include <string>
    #include <sstream>
    #include "Random.h"
    #include "time.h"
    
    using namespace std;
    
    void createRandomNumbers(long range, char *file){
    	Random rand = Random(range);
    
    	try{
    		ofstream str_csv(file);
    
    		for(long i = 0; i < range; i++){
    			str_csv << rand.give() << '\n';
    		}
    
    		str_csv.close();
    	}
    	catch(const char *errorMsg){
    		cerr << errorMsg << endl;
    	}
    }
    
    // datei einlesen und in feld abspeichern
    void datei_einlesen(long range, char *file, long *a[])
    {
    
    	long _count = 0;
    		try{
    			ifstream str_csv(file);
    
    			while(!str_csv.eof()){
    				string line;
    
    				getline(str_csv, line, '\n');
    				a[_count] = new long(atoi(line.c_str()));
    				 cout<<_count<<endl;
                    _count++;
    			}
    
    			str_csv.close();
    		}
    		catch(const char *errorMsg){
    			cout << "ERROR" << endl;
    		}
    
    }
    
    //feld in datei schreiben
    void datei_schreiben(long range, long a[])
    {
    	try{
    			ofstream str_csv("ausgabe.csv");
    
    			for(long i = 0; i < range; i++){
    				str_csv << a[i] << '\n';
    			}
    
    			str_csv.close();
    		}
    		catch(const char *errorMsg){
    			cerr << errorMsg << endl;
    		}
    
    }
    
    void quickSort(long *a,long left, long right ,long variante)
    {
    
    	long version = 2;
    
        if (left < right)
        {
            long pivot = a[right];
    
            if(version==1){
                long pivot = a[(right+left)/2];
            }
    
            if(version==2){
                long pivot = a[left];
    
                if(a[right]>pivot){
                    pivot = a[right];
                }
    
                if(a[(right+left)/2]>pivot){
                    pivot = a[(right+left)/2];
                }
            }
    
    	        long l = left;
    	        long r = right;
    
    	        do
    	        {
    	            while (a[l] < pivot) l++;
    	            while (a[r] > pivot) r--;
    
    	            if (l <= r)
    	            {
    	                long swap = a[l];
    	                a[l] = a[r];
    	                a[r] = swap;
    	                l++;
    	                r--;
    	            }
    	        }
    	        while (l <= r);
    
    	        quickSort(a,left, r, version);
    	        quickSort(a,l, right, version);
            }
    
    }
    
    int main(long argc, char *argv[]){
    
    	long _range  = 100000;
    
    	clock_t start = clock();
    	char *_file("daten.csv");
    	long *a;
    	a=new long[_range];
    	cout<<"test"<<endl;
    
    	long left = 0;
    	long right = _range;
    	long *templiste;
    	templiste=new long[_range];
    
    	createRandomNumbers(_range, _file);
            datei_einlesen(_range, _file, &a);
    
    	 for(long i=0; i<_range; i++)
    	    {
    	        templiste[i]=a[i];
    	    }
    
        delete [] a;
    	quickSort(templiste,left, right, 1);
    
    	datei_schreiben(_range, templiste);
    	delete [] templiste;
    
    	clock_t end = clock();
    
        time_t time = ((start)*1000)/CLOCKS_PER_SEC;
        time_t time2 = ((end)*1000)/CLOCKS_PER_SEC;
        cout << "Start " << time << "ms" <<endl;
        cout << "End " << time2 << "ms" <<endl;
    
    	return 0;
    }
    


  • // datei einlesen und in feld abspeichern
    void datei_einlesen(long range, char *file, long *a[])
    {
        long _count = 0;
            try{
                ifstream str_csv(file);
    
                while(!str_csv.eof()){
                    string line;
    
                    getline(str_csv, line, '\n');
                    a[_count] = new long(atoi(line.c_str()));
                     cout<<_count<<endl;
                    _count++;
                }
                str_csv.close();
            }
            catch(const char *errorMsg){
                cout << "ERROR" << endl;
            }
    }
    

    Hab die Funktion mal kurz überflogen. Das ist mir aufgefallen:

    • Es sollte const char* file heißen, und nicht char *file.
    • Wieso machst du try-catch?
    • while(!str_csv.eof(); was machst du, wenn beim Lesen ein Fehler auftritt? Nimm str_csv.fail().
    • Wieso verwendest du new?
    • str_csv.close(); das brauchst du nicht zu schreiben, da es beim Verlassen des Scopes automatisch gemacht wird.


  • du mischt C mit C++
    nimm statt char* lieber std::string, statt long* a = new long[...] lieber std::vector<long>, statt atoi lieber std::stringstream



  • // datei einlesen und in feld abspeichern
    void datei_einlesen(long range, const char* file, long *a[])
    {
    
        long _count = 0;
    
        ifstream str_csv(file);
    
        while (!str_csv.fail())
        {
            string line;
            cout<<"test123"<<endl;
    
            getline(str_csv, line, '\n');
            *a[_count] = (atoi(line.c_str()));
            cout<<_count<<" "<< *a[_count] <<endl;
            _count++;
        }
    }
    

    Ich habe den Code entsprechend deiner Tipps angepasst... Zum New muss ich sagen, dass dich das verwendet habe um den Speicher zu reservieren.. lasse ich das weg so wie hier... bekomme ich nur maximal 3 Werte eingelesen!



  • Wozu schreibst du überhaupt in eine Datei?



  • Weil mein Prof das so gerne möchte 😉



  • barakneldur schrieb:

    Dabei erstelle ich Zufallswerte die ich in eine datei schreibe und dann in ein array kopiere.

    Ok, also deine Datei sieht dann z.B. so aus, oder?

    6
    2
    456
    90
    45
    

    Dann machst du das Ganze z.B. so:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    using namespace std;
    
    void datei_einlesen(const string& file, vector<int>& data)
    {
        ifstream str_csv( file.c_str() );
    
        if(!str_csv)
        {
            cerr << "Fehler beim Oeffnen der Datei";
            return;
        }
    
        for(int value; str_csv >> value; data.push_back(value));
    }
    
    int main()
    {
        vector<int> data;
    
        datei_einlesen("daten.csv",data);
    
        // Nun hast du all deine Zufallszahlen im Vector stehen.
    }
    

    314159265358979 schrieb:

    Wozu schreibst du überhaupt in eine Datei?

    Zur Übung.



  • meh

    std::vector<long> gimme_random_numers(std::size_t range)
    {
    	Random rnd(range);
    	std::vector<long> result;
    
    	while(range--)
    		result.push_back(rnd.give());
    
    	return result;
    }
    
    bool write_numbers(char const* filename, std::vector<long> const& numbers)
    {
    	std::ofstream out(filename);
    
            for(std::size_t i = 0; i < numbers.size(); ++i)
            	out << numbers[i] << '\n';
    
    	return out;
    }
    
    bool read_numbers(char const* filename, std::vector<long>& numbers)
    {
    	std::ifstream in(filename);
    
    	for(long l; in >> l;)
    		numbers.push_back(l);
    
    	return in;
    }
    

    Was mich interessieren würde: Kannst du mal Random.h posten? Den hast du doch bestimmt auch von deinem Prof, oder?



  • barakneldur schrieb:

    Weil mein Prof das so gerne möchte 😉

    Achso, heißt das, du musst char* und new verwenden?



  • Gugelmoser schrieb:

    barakneldur schrieb:

    Weil mein Prof das so gerne möchte 😉

    Achso, heißt das, du musst char* und new verwenden?

    ne er möchte nur das wir die Daten in Datei unsortiert schreiben und die sortierten wieder in ne Datei schreiben!

    hier noch ma die random.h

    #pragma once
    #include <string>
    using namespace std;
    
    class Random  {
    protected:
    	int max_range;
    private:
    	short fill_bits;
    	int fill_mask;
    public:
    	Random(int max_range);
    	~Random();
    	int give();
    };
    

    Schon mal vielen Dank für die Hilfe....

    An einen Vector-Container hatte ich auch scho gedacht!!!



  • So habe es nun mit einem Vector hinbekommen! Vielen Dank für die Hilfe 🙂


Anmelden zum Antworten