Zahlen aus einer Datei einlesen und in einem Array speichern



  • Hallo!

    Ich bin neu hier und hab keine Ahnung wie ich aus einer Datei (.txt) die Zahlen die dort drin gespeichert sind, in ein Array tun soll.

    Kann mir da jemand helfen?

    Danke im Voraus!



  • versuchs mal hiermit:

    http://www.cplusplus.com/reference/iostream/fstream/open.html

    dazu kannst du zB auch die get() funktion zum einlesen benutzen.



  • Hast du schon was ausprobiert?
    Tip:
    Du weist einer Variable vom Typ char einfach die Elemente zu und liesst den Inhalt ein und holst dir per getline jede Zeile in das Array.



  • zu Dateioperation:
    http://www.willemer.de/informatik/cpp/fileop.htm

    Um aus Strings Zahlen(also zum Beispiel integer) zu machen kannst du stringstream benutzen.



  • Hallo!

    Danke für die Antworten! Ich habe nun meine Datei, die Zahlen enthält, eingelesen und eine ganze Zeile in ein char gespeichert.
    Wie kann ich nun den Inhalt des chars zuerst trennen und dann in ein Array reinschreiben?
    Also ich habe zum Beispiel in der Dateil 1 2 3 4,5 4,7 7,9 9,8 10,1 11 12 stehen und möchte gerne die Zahlen in ein Array schreiben.
    Zum Beispiel

    int array[20];
    array[0] = 1;
    array[1] = 2;
    array[2] = 3;
    array[3] = 4,5;
    

    usw.

    Wie geht das?



  • Also, wenn es denn zwingend ein Array sein muss, dann könntest du das folgendermaßen machen:

    //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("zahlen.txt");
    	// Überprüfung ob Datei geöffnet wurde
    	if(!input) {
    		cerr << "Datei wurde nicht gefunden." << endl;
    		return EXIT_FAILURE;
    	}
    	double darr[20];
    	int index = 0;
    	double wert;
    	// Inhalt der Datei Zahl für Zahl einlesen
    	while(input >> wert)
    		// Weist einem Element des Arrays den zuletzt eingelesen Wert zu
    		darr[index++] = wert;
    	// Gibt alle Elemente des Arrays nebeneinader aus
    	for(int ix = 0; ix != 20; ++ix)
    		cout << darr[ix] << " ";
    	cout << endl;
    
    	return 0;
    }
    

    Die in meinem Code verwendete .txt Datei hat folgenden Inhalt:

    1 2 3 4.5 4.7 7.9 9.8 10.1 11 12
    12 11 10.1 9.8 7.9 4.7 4.5 3 2 1
    

    Die Ausgabe meines Programms wäre dann also:

    1 2 3 4.5 4.7 7.9 9.8 10.1 11 12 12 11 10.1 9.8 7.9 4.7 4.5 3 2 1
    

    Ich würde dir aber dazu raten, eher einen Vektor statt ein Array zu verwenden. Mit einem Vektor könnte der Code dann folgendermaßen aussehen:

    //main.cpp
    #include <iostream>
    #include <fstream>
    #include <vector> // Den Header nicht vergessen ;)
    using std::cout;
    using std::cerr;
    using std::endl;
    using std::ifstream;
    using std::vector;
    
    int main()
    {
    	// Zu lesende Datei öffnen
    	ifstream input("zahlen.txt");
    	// Überprüfung ob Datei geöffnet wurde
    	if(!input) {
    		cerr << "Datei wurde nicht gefunden." << endl;
    		return EXIT_FAILURE;
    	}
    	vector<double> dvec;
    	double wert;
    	// Inhalt der Datei Zahl für Zahl einlesen
    	while(input >> wert)
            // Fügt zuletzt eingelesenen Wert einem Vektor hinzu
    		dvec.push_back(wert);
    	// Gibt alle Elemente des Vektors nebeneinander aus
    	for(vector<double>::iterator it = dvec.begin(); it != dvec.end(); ++it)
    		cout << *it << " ";
    	cout << endl;
    
    	return 0;
    }
    

    Die Ausgabe dieses Codes entspricht der Ausgabe des obigen Codes. Der Vorteil des Vektors bei deinem konkreten Problem wäre z. B. das du dir um die Anzahl der in deiner Datei enthaltenen Zahlen keine Gedanken machen müsstest, da du ja, wie du in meinem 2. Code auch siehst, dem Vektor keine konkrete Größe mitzugeben brauchst (jaja, ich weiß das man Arrays auch dynamisch erzeugen kann :p).

    Ich hoffe ich konnte dir weiterhelfen :).



  • 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