Textdatei verarbeiten



  • Hallö,
    aktuell versuche ich mich an einem c++ Projekt. Ich bräuchte Hilfe, um weiter zu kommen. Ich habe eine Textdatei, die das Programm einlesen kann. Nun versuche ich die Zahlen herauszufiltern und so zu speichern, dass das Lineare Gleichungssystem gelöst werden kann.

    Nun meine Frage: wie filtere ich die Zahlen heraus und speicher sie passend ab?

    Bin für jede Hilfe dankbar 🙂
    Liebe Grüße



  • Wenn

    double value;
    if (input_stream >> value) {
        // funktioniert ist es eine Zahl
    }
    else {
        input_stream.clear();
        // mach was anderes damit. zB mit
        while (!std::isdigit(input_stream.peek()))
            input_stream.get();  // Zeichen wegwerfen oder anderweitig verarbeiten
                                 // bis wieder eine Ziffer kommt.
    }
    


  • #include <fstream>
    #include <iostream>
    
    int main() {
    	std::ifstream Stream("?.txt");
    	
    	while (Stream) {
    		if (isdigit(Stream.peek())) {
    			// Ziffer gefunden, es kommt eine Zahl
    			int Number;
    			Stream >> Number;
    			std::cout << Number << '\n';
    		}
    		else {
    			Stream.get();
    		}
    	}
    

    so sieht meins zurzeit aus.
    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 + 5*x4 >= 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?



  • @lauriMo sagte in Textdatei verarbeiten:

    Komm an dieser Stelle nicht weiter.

    Wo ist Dein Problem?

    @lauriMo sagte in Textdatei verarbeiten:

    Ich möchte gerne die Zahlen aus der Datei speichern

    Der Code den Du gezeigt hast tut (nachdem man ihn geändert hat so daß er compiliert) genau das.



  • Das Problem ist wie ich weiter machen muss... Die zahlen so weiter zu verwerten, dass ich damit das Lineare Gleichungssystem lösen kann. Also einfügen von Slack Variablen und das Ergebnis erhalten. Ich steh etwas auf dem Schlauch



  • Wie würdest du denn das Gleichungssystem von Hand lösen? Schritt für Schritt! Und dann kannst du pro kleinem Schritt eine Funktion schreiben, die genau das tut, was du sonst händisch tun würdest.



  • @lauriMo sagte in Textdatei verarbeiten:

    Bei der Datei handelt es sich um Funktionen.
    zb. so:
    // Objective function
    min: + 1x0 + 6x1 + 4x2 + 8x3 + 1*x4;

    Wenn in der Datei also nicht nur Zahlen stehen, sondern komplette Ausdrücke, dann benötigst du einen (Funktions-)Parser.
    Wenn du jedoch weißt, daß immer nur die Teilausdrücke x0 - xN dort drin stehen, dann kannst du die einzelnen Teile davon (in einer Schleife) einlesen, z.B.

    char sign;
    double value;
    char x;
    int e;
    
    in >> sign >> value >> x >> e;
    

    Und dann die Werte in einer passenden Datenstruktur abspeichern (z.B. vector<double>, wo der Index dann dem Exponenten 'e' entspricht).



  • @lauriMo sagte in Textdatei verarbeiten:

    Das Problem ist wie ich weiter machen muss.

    Um Dir dabei helfen zu können müsstest Du schon Allgemein etwas zum Dateiformat sagen.



  • 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];
        }
    }
    

Log in to reply