Zahlen aus einer Datei einlesen und in einem Array speichern



  • Hallo!

    Danke für eure Hilfe.
    Ich habe habe ein weiteres Problem. Wenn ich eine Datei einlese die so aussieht:

    X Y
    1 12
    2 14
    3 15
    4 18
    5 20
    

    Also dass die links immer X ist und rechts Y, dann hätte ich auch gern im xArray die linken Zahlen und im yArray die rechten Zahlen. Wie mache ich das?
    Bis jetzt habe ich hingekriegt, dass alle Zahlen nacheinander ins xArray geschreiben werden. Und dann kann ich "per Hand" immer die zweite Zahl des xArrays dem yArray zuweisen, was aber nicht so toll ist.

    Was könnte ich da machen?



  • Mach doch einfach 2 Arrays (oder wie schon gesagt besser std::vector), dann kannst du die jeweils nacheinander einlesen.

    std::vector<int> x;
    std::vector<int> y;
    
    std::ifstream int("in.txt");
    
    for (int i; ...) //jede zeile
       {
         in >> x[i];
         int >> y[i];
       }
    


  • Hallo!

    Ich habe zwei Arrays gemacht, aber dann werden ja alle zahlen aus den zeilen in ein array gespeichert.
    Vektoren kenn ich noch nicht.

    X Y
    1 12
    2 14
    3 15
    4 18
    5 20
    

    In der obigen Form liegen Zahlen vor. Links ins xArray, rechts ins yArray.
    Aber ich weiss nicht wie das funktionieren soll.



  • Irgendwie habe ich heute einen guten Tag, weshalb ich dir auch für dein Folgeproblem nochmal die ausführliche Lösung gebe und das obwohl du schon durch drakons kurzen Codeauszug auf die Lösung hättest kommen können.

    //main.cpp
    #include <iostream>
    #include <fstream>
    using std::cout;
    using std::cerr;
    using std::endl;
    using std::ifstream;
    
    int main()
    {
    	// Zu lesende Datei öffnen
    	ifstream input("koordinaten.txt");
    	// Überprüfen ob Datei geöffnet wurde
    	if(!input) {
    		cerr << "Datei wurde nicht gefunden." << endl;
    		return EXIT_FAILURE;
    	}
    	const int koordinaten_anzahl = 5; // Für die größe der Arrays
    	int arr_x[koordinaten_anzahl], arr_y[koordinaten_anzahl];
    	int wert_x, wert_y;
    	// Liest bei jedem Schleifendurchlauf 2 Werte ein
    	for(int index = 0; input >> wert_x >> wert_y; ++index) {
    		// Weist die beiden eingelesenen Werte dem entsprechenden Array zu
    		arr_x[index] = wert_x;
    		arr_y[index] = wert_y;
    	}
    	// Paarweise Ausgabe der Elemente beider Arrays
    	for(int ix = 0; ix != koordinaten_anzahl; ++ix)
    		cout << "[" << arr_x[ix] << "," << arr_y[ix] << "]" << endl;
    
    	return 0;
    }
    

    Der Vollständigkeit halber noch der Inhalt meiner .txt Datei:

    1 12
    2 14
    3 15
    4 18
    5 20
    

    Und die Ausgabe meines Programms:

    [1,12]
    [2,14]
    [3,15]
    [4,18]
    [5,20]
    

    So, aber beim mal nächsten bitte etwas mehr Eigeninitiative zeigen und ich möchte dir noch einmal den Rat geben, eher Vektoren als Arrays zu nutzen.



  • Hallo!
    Mizar ich dank dir tausendmal!
    Ohne diese Lösung wäre ich mit meinem Programm nie fertig geworden!
    DANKE!!!!

    Aber könntest du mir erklären was dieser Ausdruck genau bedeutet??

    input >> wert_x >> wert_y
    

    Danke



  • input >> wert_x >> wert_y;
    

    Diese Anweisung habe ich als Bedingung meiner ersten for -Schleife benutzt:

    for(int index = 0; input >> wert_x >> wert_y; ++index)
    

    und vom Prinzip her läuft das ganze folgendermaßen ab:
    Das ifstream -Objekt input liest aus der mit ihm verknüpften Datei die erste Zahl aus und diese Zahl wird in der Variablen wert_x eingelesen. Anschließend wird gleich die nächste Zahl aus der entsprechenden Datei gelesen und diese wird nun in der Variablen wert_y eingelesen. Daraufhin wird nun der Schleifenrumpf ausgeführt in dem wiederum die Werte der beiden Variablen einem Element des entsprechenden Arrays zugewiesen werden. Nach der Durchführung der Anweisungen innerhalb des Schleifenrumpfes wird die Variable index inkrementiert und dann geht das ganze wieder von vorne los, wodurch die nächsten beiden Zahlen aus der Datei ausgelesen werden. Da ich das auslesen der Datei als Bedingung der for -Schleife genutzt habe, wird die for -Schleife solange durchlaufen bis es keine Zahlen mehr auszulesen gibt (oder ein anderer Fehler beim lesen auftritt).

    Ich hoffe mal das war relativ verständlich :).



  • Danke, das war sehr verständlich erklärt, aber wenn ich jetzt zum Beispiel Zahlen in mein Programm einlesen wollte, die nicht durch ein Leerzeichen sondern durch ein Komma oder ähnliches getrennt sind, wie müsste das dann heißen?
    Und nochmals vielen Dank, dass Du mir alles erklärst!



  • Wenn ich schon einmal einen guten Tag habe, dann muss man das ja ausnutzen ;).
    Ok, gehen wir mal davon aus das in einer entsprechenden .txt Datei folgendes drin steht:

    1,12 
    2,14 
    3,15 
    4,18 
    5,20
    

    In diesem Falle müsstest du an meinem zuletzt geposteten Code nur folgende Kleinigkeiten ändern:

    char trennzeichen;
    for(int index = 0; input >> wert_x >> trennzeichen >> wert_y; ++index) {
        arr_x[index] = wert_x;
        arr_y[index] = wert_y;
    }
    

    Wie du siehst habe ich nur eine weitere Variable hinzugefügt, in der das Trennzeichen (also z. B. ein Komma) eingelesen wird.

    Für den Fall das du dich noch weiter mit dem lesen aus Dateien beschäftigen möchtest, würde ich dir auf jeden Fall noch dazu raten einmal nach "stringstreams" und auch nach "vector" oder anderen Containern der STL zu googeln.



  • Mizar DU BIST DER BESTE!! 🙂

    Vielen Dank für deine Hilfe! 👍 👍 👍

    MfG



  • cplusplus_newbie schrieb:

    Mizar DU BIST DER BESTE!! 🙂

    Oh, das wage ich zu bezweifeln ;), dennoch freut es mich das ich helfen konnte.



  • Hallo,
    bei mir kommen dann voll die dummen Koordinaten raus etwa so:
    [486435183,0]
    [5843.651635]
    usw.

    #include <iostream>
    #include <fstream>

    using namespace std;

    int main()
    {
    ifstream input("Zahlen.txt");

    int koordinaten_anzahl = 10;
    int arr_x[koordinaten_anzahl];
    int arr_y[koordinaten_anzahl];
    int wert_x;
    int wert_y;

    for(int index = 0; input >> wert_x >> wert_y; ++index)
    {
    arr_x[index] = wert_x;
    arr_y[index] = wert_y;

    }

    for(int ix = 0; ix != koordinaten_anzahl; ++ix)

    system("pause");
    return 0;
    }



  • Sorry falscher Quellcode
    hier der richtige:

    #include <iostream>
    #include <fstream>

    using namespace std;

    int main()
    {
    ifstream input("Zahlen.txt");

    int koordinaten_anzahl = 10;
    int arr_x[koordinaten_anzahl];
    int arr_y[koordinaten_anzahl];
    int wert_x;
    int wert_y;

    for(int index = 0; input >> wert_x >> wert_y; ++index)
    {
    arr_x[index] = wert_x;
    arr_y[index] = wert_y;

    }

    for(int ix = 0; ix != koordinaten_anzahl; ++ix)

    system("pause");
    return 0;
    }



  • Noopc++ schrieb:

    int koordinaten_anzahl = 10;
    

    Diese Variable sollte besser const sein, da sie sich ja eigentlich nicht ändern sollte.

    const int koordinaten_anzahl = 10;
    

    Ansonsten sehe ich erstmal nichts was zu beanstanden ist, außer das du deinen Code besser zwischen den C/C++ - Tags setzen solltest so sehen die aus [/cpp] und [cpp]. Dadurch wird dein Code lesbarer.

    Weil ich sonst keinen Fehler sehe (war ja wohl auch eher Copy & Paste 😉 ), stellt sich mir die Frage wie die Zahlen in deiner .txt Datei drinstehen.


Anmelden zum Antworten