CSV in Klasse Einlesen aus funktion in klasse schreiben



  • Hallo zusammen

    Ich hab folgendes Problem. Aus einem FTP-Server lade ich eine CSV datei aus welcherich, in einer funktion, die relevanten daten auslese und schreibe diese dann in eine klasse. Das ganze funktioniert soweit ganz gut. Wenn ich aber ein Objekt der Klasse an die funktion übergebe und nicht aus der funktion dirreckt mit dem Objektnamen auf sie zugreife schreibt mir die funktion Plötzlich nur noch 0 rein. Kann mir jemand sagen woran das liegt und wie ich den code abänder muss, dass das ganze funktioniert?

    Der code so wie er nicht funktioniert

    void CSV_Einlesen(Automation automat){
    
    	FILE *CSV;
    	int houres;
    	int minutes;
    	int day;
    	int month;
    	int year;
    	int event;
    	int teile;
    	int zykluszeit;
    	int running;
    	int i;
    
    
    	CSV = fopen("C:\\Temp\\logspsfile.csv","r");
    
    	i = 0;
    
    	while (((fscanf(CSV,"%i;%i;%i;%i;%i;%i;%i;%i;%i \n",&houres,&minutes,&day,&month,&year,&teile,&zykluszeit,&running,&event)) != EOF) && (i <= 99))
    	{
    		automat.ahoures[i] = houres;
    		automat.aminutes[i] = minutes;
    		automat.aday[i] = day;
    		automat.amonth[i] = month;
    		automat.ayear[i] = year;
    		automat.aevent[i] = event;
    		automat.ateile[i] = teile;
    		automat.azykluszeit[i] = zykluszeit;
    		automat.arunning[i] = running;
    
    		i++;
    
    	}
    
    	fclose(CSV);
    
    	DeleteFileA("C:\\Temp\\logspsfile.csv");
    
    	if (automat.ateile[0] == 0) {
    		automat.ateile[0] = 1;
    	}
    
    }
    

    der Code wie er funktioniert (Automation1 = Obejkt von Klasse Automation)

    
    void CSV_Einlesen(){
    
    	FILE *CSV;
    	int houres;
    	int minutes;
    	int day;
    	int month;
    	int year;
    	int event;
    	int teile;
    	int zykluszeit;
    	int running;
    	int i;
    
    
    	CSV = fopen("C:\\Temp\\logspsfile.csv","r");
    
    	i = 0;
    
    	while (((fscanf(CSV,"%i;%i;%i;%i;%i;%i;%i;%i;%i \n",&houres,&minutes,&day,&month,&year,&teile,&zykluszeit,&running,&event)) != EOF) && (i <= 99))
    	{
    		Automation1.ahoures[i] = houres;
    		Automation1.aminutes[i] = minutes;
    		Automation1.aday[i] = day;
    		Automation1.amonth[i] = month;
    		Automation1.ayear[i] = year;
    		Automation1.aevent[i] = event;
    		Automation1.ateile[i] = teile;
    		Automation1.azykluszeit[i] = zykluszeit;
    		Automation1.arunning[i] = running;
    
    		i++;
    
    	}
    
    	fclose(CSV);
    
    	DeleteFileA("C:\\Temp\\logspsfile.csv");
    
    	if (Automation1.ateile[0] == 0) {
    		Automation1.ateile[0] = 1;
    	}
    
    }
    


  • Woher weisst du, dass nichts drin steht?



  • @Vynix sagte in CSV in Klasse Einlesen aus funktion in klasse schreiben:

    void CSV_Einlesen(Automation automat)

    Dir ist klar, dass automat hier eine Kopie ist, die sofort am Ende der Funktion verworfen wird?

    Du willst vermutlich void CSV_Einlesen(Automation& automat), besser wäre vielleicht Automation CSV_Einlesen().



  • Zum einen verarbeite ich die werte später weiter zum andern hab ich wärend dem ausführen mittels brakingpoints die einträge angesehen.



  • Okay mit Pointer funktionierts. Das ist mir jetz ein wenig peinlich 😅
    Danke dir



  • @Vynix sagte in CSV in Klasse Einlesen aus funktion in klasse schreiben:

    fscanf(/* ... */) != EOF
    

    Nur weil fscanf() nicht EOF liefert heißt das nicht, daß alles supi ist. Schau dir mal an, was fscanf() in welchen Fällen zurückgibt.



  • Vermutlich können auch noch andere schlimme Dinge passieren. Wenn ich automat.ahoures[i] ohne Vorbereitungen sehe (und ich meine jetzt nicht, dass hours falsch geschrieben wurde) dann wird mir gruselig.



  • @DocShoe sagte in CSV in Klasse Einlesen aus funktion in klasse schreiben:

    dann wird mir gruselig.

    Mir auch, aber immerhin gibt es hier einen check auf i <= 99. Also scheint hier irgendwo eine magische Grenze eingebaut zu sein.
    Auch wird nicht getestet, ob die Datei überhaupt geöffnet werden konnte 😞



  • @manni66 sagte in CSV in Klasse Einlesen aus funktion in klasse schreiben:

    Du willst vermutlich void CSV_Einlesen(Automation& automat), besser wäre vielleicht Automation CSV_Einlesen().

    Noch viel lieber möchte er vermutlich

    std::optional<Automation> read_automation( const std::string& file_name );
    

    oder

    Automation read_automation( const std::string& file_name );
    ...
    void f()
    {
       try
       {
          Automation automation = read_automation( ... );
          ...
       }
       catch( std::exception& excp )
       {
       }
    }
    

Anmelden zum Antworten