Textfile lesen
-
@wob sagte in Textfile lesen:
Ich würde daher inzwischen immer https://github.com/fmtlib/fmt empfehlen.
Man sollte vielleicht nicht unerwähnt lassen, dass die mittlerweile auch zum (C++20) Standard gehört: std::format.
-
Dieser Beitrag wurde gelöscht!
-
@wob Ich habe die ersten 50 Zeilen genommen und es hat problemlos funktioniert. Nur bei mehr als 10000 Zeilen ignoriert er die ersten Zeilen, voll komisch.
Das Output startet einfach ab Zeile 1279
-
@Zafar sagte in Textfile lesen:
@wob Ich habe die ersten 50 Zeilen genommen und es hat problemlos funktioniert. Nur bei mehr als 10000 Zeilen ignoriert er die ersten Zeilen, voll komisch.
Das Output startet einfach ab Zeile 1279
Du machst etwas anderes falsch oder die Textdateien enthalten nicht das, was du denkst. Die Funktion weiß doch am Anfang noch gar nicht, wie viele Zeilen es geben wird.
Wie sieht dein vollständiges Programm aus, woher weißt du, dass es die ersten Zeilen nicht korrekt einliest? Hinterfrage jedes Detail deiner Annahmen!
(und zuletzt: bist du sicher, dass du C++ brauchst, geht nicht Python? Geht es um parton density functions von Blei-Blei und Muonen-Transversalimpuls? Wäre meine Vermutung anhand des Dateinamens...)
-
@wob Ich habe was ausprobiert, habe in der while Schreife einen counter eingebaut und dann diesen counter ausgeben lassen. Bei beispielsweise 500 Zeilen gibt der counter mir auch 500 an. Vielleicht liegt es daran, dass mein bash diese große Anzahl an Zeilen net komplett ausgeben kann. Ich benutze zur Info Linux.
Ich benutze ein framework, das sich root nennt. das ist auf c++ basiert
-
Was hat bash jetzt damit zu tun?! (es gibt auch ein paar Commits von mir im ROOT-Source...)
Rat: Nimm Python (ok, zumindest für soche Sache wie Einlesen)! ROOT hat doch wundervolle Python-Bindings.
-
@wob einfach den Code fürs Einlesen in python umwandeln?
-
Das ist nur ein genereller Rat. Weil solche Dinge in Python sehr viel einfacher sind. Aber du hast doch schon praktisch den ganzen Einlesecode. Ich kann nicht erraten, was bei dir falsch läuft.
Liest du in einen TTree ein? Nutzt du RDataFrames?
-
@wob Weder das eine noch das andere. Ich lese nur die Datei ein mit ifstream und will daraus ein Histogram erstellen
-
kannst du die Datei irgendwo hochladen?
-
@wob Hast du Dropbox?
-
nö
-
https://github.com/zmomtaz/Textfile-.git
Hier ist die Textdatei
-
Also bei mir kommt da raus:
$ g++ orig.cpp&&./a.out|grep Found|wc -l 11276
Aber warum nicht einfach alles wegschmeißen und es so machen: root starten und eingeben:
auto t = new TTree("t", "t"); t->ReadFile("data.txt", "q2lo/D:q2hi:ylo:yhi:qTlo:qThi:PDF0:uncertainty"); t->Draw("PDF0>>h(100,-20,20)");
oder halt nach dem ReadFile einfach nen TBrowser starten.
-
Aus dem TTree kann ich "yield" einlesen oder?
-
@Zafar sagte in Textfile lesen:
Aus dem TTree kann ich "yield" einlesen oder?
Das, was du offenbar yield nennst, ist in der Datei doch die vorletzte Spalte. Die scheint doch der Überschrift nach PDF0 zu heißen. Aber den Namen kannst du doch frei vergeben in dem ReadFile.
Generell: ich würde dir gleiche Namen für gleiche Dinge raten. Wenn es in der Überschrift q2lo und q2hi heißt, warum nicht dann auch die Variablen exakt so benennen?
-
@Zafar sagte in Textfile lesen:
@wob Ich habe die ersten 50 Zeilen genommen und es hat problemlos funktioniert. Nur bei mehr als 10000 Zeilen ignoriert er die ersten Zeilen, voll komisch.
Das Output startet einfach ab Zeile 1279
Wie groß ist denn der Buffer deiner Konsole?
Leite die Ausgabe doch mal in eine Datei um.
-
@DirkB sagte in Textfile lesen:
Wie groß ist denn der Buffer deiner Konsole?
Da die Datei 11276 Datenzeilen hat, rate ich einfach mal: 10.000 Zeilen
-
Der Zeilenpuffer Limit war tatsächlich bei 10000. Es lag tatsächlich an diesem Limit. Es war nur eine kleine Feinjustierung nötig
Trotzdem vielen Dank für die Hilfen!
-
@wob , ich habe versucht meinen Histogram mit dem yield und den Bins zu erstelle. ich bekomme irgendwie eine Endlosschleife , wobei der yield immer 0 ist bei printf. Die Variablen nbinsx und nbinsy habe ich vorher deklariert und sind die Anzahl der Bins in x und y Richtung.
while (in) { in_pos = in.tellg(); if (in >> m_low >> m_high >> y_low >> y_high >> pt_low >> pt_high >> yield >> uncertainty) { if(y_low > 6) continue; yield = yield * 1e-15 * 2.632e-11; for (int i=1;i<=nbinsx;i++) { for(int j=1;j<=nbinsy;j++) { printf("Found entry, yield is %f\n", yield); drell->SetBinContent(i,j,yield); } }