Textdatei verarbeiten



  • Die Textdatei ist immer gleich auf gebaut, jedoch können die Funktionen verschieden lang sein. Ich möchte mir ersteinmal die Zahlen Ausgeben lassen und es so hinbekommen, dass ich die Textdatei frei auswählen kann, also nicht fest programmiert.



  • Hast du mal meinen Ansatz ausprobiert?



  • kannst du mir den genauer erklären? ich versteh nicht so ganz wie das ablaufen soll.



  • Bei deinem Ansatz würdest du ja alle Zahlen auf dieselbe Art einlesen, also z.B. auch die 1 bei x1 und könntest diese nicht von der 1 bei + 1 x0 unterscheiden.
    Ich lese die Einzelteile so eines Ausdrucks getrennt ein.



  • Stimmt, das macht Sinn. Daran hab ich garnicht gedacht. Mist. Also hab ich die Zahlen von den X Sachen auch mit bei der Ausgabe, so sollte das nicht sein.



  • @wob
    Bin damit etwas überfordert, da die Dateien unterschiedlich lange Funktionen haben...



  • @lauriMo sagte in Textdatei verarbeiten:

    Ich möchte gerne die Zahlen aus der Datei speichern und dann den Gauß anwenden. Bei der Datei handelt es sich um Funktionen.
    zb. so:
    // Objective function
    min: + 1x0 + 6x1 + 4x2 + 8x3 + 1*x4;
    // constraints

    8x0 + 3x1 + 1x2 + 4x3 + 5x4 >= 9;
    6x0 + 6x1 + 7x2 + 3x3 + 3
    x4 >= 4;
    9x0 + 4x1 + 2x2 + 4x3 + 4*x4 >= 1;

    Komm an dieser Stelle nicht weiter. Hat jemand eine Idee?

    Sicher das du hier ein lineares Gleichungssystem hast? Das ganze sieht mir eher aus wie ein Problem der linearen Optimierung.

    Ich hoffe mal das du das Eingabeformat frei wählen kannst. Denn dann würde ich dir die Vektorform empfehlen. Dein Problem sähe dann so aus:

    Min: (1 6 4 8 1) * (x0 x1 x2 x3 x4)^T
    
    Const: (8 3 1 4 5) * (x0 x1 x2 x3 x4)^T >= 9
    Const: (6 6 7 3 3) * (x0 x1 x2 x3 x4)^T >= 4
    Const: (9 4 2 4 4) * (x0 x1 x2 x3 x4)^T >= 4
    

    Oder in Kurzform

    Min: (1 6 4 8 1) * x
    
    Const: (8 3 1 4 5) * x >= 9
    Const: (6 6 7 3 3) * x >= 4
    Const: (9 4 2 4 4) * x >= 4
    

    So ein Format wäre wesentlich einfacher einzulesen als das von dir gezeigte.



  • Mal was anderes: wo muss eine Datei gespeichert werden, damit das Programm diese öffnen kann?

    ifstream Stream("?.txt");
    

    Programm hat Probleme sie zu öffnen. Gibt es Tipps?

    
    int main() {
    	ifstream Stream("KI_5.txt");
    
    	string line;
    	if (Stream.is_open()) {
    		
    		
    		while (getline (Stream, line)) {
    			size_t pos = line.find(' ');
    			if (pos != string::npos) {
    				line = line.substr(pos,pos + 2);
    			}
    		}
    	}
    	else {
    		// show message:
    		std::cout << "Error opening file";
    	}
    	
    	cout << line << endl;
    	cin.get();
    	return 0;
    }
    

    hier noch der Rest. Vlt liegt dort auch der Fehler...



  • @lauriMo sagte in Textdatei verarbeiten:

    Gibt es Tipps?

    tip.



  • Die Pfadangaben sind immer relativ zum aktuellen Arbeitsverzeichnisses des Prozesses (welches standardmäßig gleich dem aktuellen Verzeichnis des Programms ist).
    Packe also die Textdatei in das gleiche Verzeichnis wie das ausführbare Programm.

    Mit getcwd (unter Linux) bzw. GetCurrentDirectory(unter Windows) kannst du dir das aktuelle Arbeitsverzeichnis (current wokring directory) anzeigen lassen.



  • Genau. Oder verwende absolute Pfade.



  • Aber keine absoluten Pfade als String-Literale im Code verwenden!
    Wenn dann höchstens Pfade zur Laufzeit zusammensetzen, aber auch dann müßte man eine Funktion aufrufen, welche einen Pfad ermittelt.

    Oder man übergibt den Pfad zur Datei als Kommandozeilenparameter und liest diese dann aus:

    int main(int argc, char** argv)
    {
        if (argc > 1) // in argv[0] steht immer der Programmname (bzw. evtl. auch mit Pfadangabe)
        {
             string path = argc[1];
        }
    }
    

Anmelden zum Antworten