Daten auslesen aus einer Textdatei (.txt)

cwriter

Erfahrenes Mitglied
Jetzt stehe ich aber vor der Hürde alle nötigen Zahlen in ein ausreichend großes double array zu speichern.
Unter anderem, weil die Prämisse falsch ist?
Dein Array ist nicht gross genug (du hast 4*2 Slots).
Dein "funktioniert" funktioniert auch nur aus Versehen: Du gehst 2 Einträge über die Indizes raus, d.h. du nutzt eigentlich v[0][0], v[0][1], v[1][0], v[1][1]. (Warum liest du denn jetzt 4 Werte?)

Wäre gut wenn ich das in eine schleife einbauen könnte?
Sowas?
C++:
double v[num_lines][3];
for(size_t i = 0; i < num_lines;++i) {
datei >> v[i][0] >> v[i][1] >> v[i][2];
}

Du kannst den operator>> nicht für doubles verwenden (doch, schon, aber nicht zu diesem Zweck). Achte auf den Rückgabewert von istream::operator>>().

Gruss
cwriter
 

ZeroZ

Grünschnabel
Hey cwriter, danke für deine Hilfe.

Bin soweit recht weit gekommen.
Aktuell bin ich bei dem Problem, dass mein double array viel zu groß wird ( z.B. double v[105490][3] ). Ab v[52735] speichert er nur noch nullen ab und legt nicht mehr die Zahlen aus der Text Datei ab. Habe jetzt gelesen, dass ein vector sinnvoller wäre. Hast du ein Tipp?
 

cwriter

Erfahrenes Mitglied
dass mein double array viel zu groß wird
Später muss ich diese verarbeiten z.B. alle 10 Werte mit den nächsten 10 vergleichen und das ganze mitteln damit man am Ende 10 Werte (von den ursprünglichen 1000) hat. Quasi über 10 Werte gemittelt.
Gilt nicht mehr?

Ab v[52735] speichert er nur noch nullen ab und legt nicht mehr die Zahlen aus der Text Datei ab.
Wie viele Werte hast du denn? :O

std::vector ist schlecht (bzw. Overkill) für diese Aufgabe. Du kannst es mit std::array machen, oder aber du gehst den alten, verlässlichen Weg:

C++:
double* v = new double[num_lines * 3];
if(v == nullptr)
{
    std::cout << "Kein Speicher vorhanden!" << std::endl;
    exit(1);
}

//Dasselbe mit dem Einlesen, nur jetzt als v[i * 3 + 0], v[i * 3 + 1], v[i * 3 + 2]

delete v;

Warum ist std::vector ungeeignet: Der std::vector ist ein STL-Container, der sich in der Grösse verändern kann. Das kostet aber Zeit. Ein std::array (oder die rohen Arrays) garantieren dir nur eine bestimmte Grösse (nämlich die, die du angegeben hast) und lassen sich nicht in der Grösse verändern, sind also wesentlich einfacher gestrickt. Da bei dir die Datenmenge durch die Zeilenzahl begrenzt ist, kennst du die Grösse im Voraus (bzw. kannst sie abschätzen).

Gruss
cwriter
 

ZeroZ

Grünschnabel
Also es sind durchaus auch manchmal bis zu 160.000 mal 3 Zahlen. Das ganz am Anfang war ein Beispiel, mir war nicht bewusst, dass da eine Begrenzung ist für arrays.

"std::array machen, oder aber du gehst den alten, verlässlichen Weg:"

Was meinst du ich kann es mit std:array machen? Es funktioniert ja nicht mit einem double array. Ich schaue mir gleich dein Beispiel oben an. Danke :)
 

cwriter

Erfahrenes Mitglied
Das ganz am Anfang war ein Beispiel, mir war nicht bewusst, dass da eine Begrenzung ist für arrays.
Die Begrenzung besteht in erster Linie in der Begrenzung des Stackspaces. 52735 * 3 * 8= 1 MiB. (Das sieht mir eher tief aus... Bekommst du keine Compilerwarnungen / Errors? Oder sind die Werte auf dieser Zeile einfach 0?)

EDIT: Habe es gefunden: https://softwareengineering.stackexchange.com/questions/310658/how-much-stack-usage-is-too-much
Passt also :)

Was meinst du ich kann es mit std:array machen? Es funktioniert ja nicht mit einem double array.
std::array ist eine Klasse. http://www.cplusplus.com/reference/array/array/
Es gibt Stack- und Heaparrays. (Das Beispiel oben ist ja auch ein Array auf dem Heap. Ein std::array macht dasselbe, aber versteckt es ein bisschen).

Gruss
cwriter
 

ZeroZ

Grünschnabel
Also ich habe folgendes gemacht:

C++:
double *myArray = new double[105490 * 3];

    for(int i=0; i<105490; i++)
        {
            for (int j=0; j<3; j++)
            {
                datei >> myArray[i * 3 + j];
               
            }
        }

    cout <<    myArray[52735 * 3 + 0] <<"  ";
    cout <<    myArray[52735 * 3 + 1] <<"  ";
    cout <<    myArray[52735 * 3 + 2];
    cout << endl;
    cout <<    myArray[52736 * 3 + 0] <<"  ";
    cout <<    myArray[52736 * 3 + 1] <<"  ";
    cout <<    myArray[52736 * 3 + 2] <<"  ";

Leider erhalte ich ab [52735 * 3 + 2] wieder nur Nullen als Ausgabe. Habe ich ein Fehler gemacht?
 

ZeroZ

Grünschnabel
ca. 100.000 Zeilen a drei Spalten. Also 300.000 Zahlen

Nein sie sind nicht an dieser Stelle bei Null. Habe extra immer nachgeprüft ob die gespeicherten Zahlen korrekt sind.