Array of integer erhält unsinnige Werte
-
Hallo zusammen,
ich sitz hier gerade vor einem Problem und komm überhaupt nicht weiter. Nach langer Suche habe ich den Fehler darauf eingegrenzt, dass ein Array völlig unsinnige Werte speichert.
Ich tue folgendes:
while(! indata.eof()){ indata >> num; indata >> nu; spal[array_pos]=num; array_pos++; }Dabei ist indata ein Filestream. In der Datei, deren Struktur korrekt ist, stehen in jeder Zeile eine ganze Zahl und eine Gleitkommazahl mit Leerzeichen getrennt. Die ganze Zahl wird in num eingelesen und soll im Array spal gespeichert werden. Spal ist ein Integer Array, array_pos ein Integer und nu ein float, der aber auch egal ist.
Die Arrays sind, das hab ich überprüft, ausreichend groß dimensioniert.
Irgendwann (die Datei hat etwa 40 Millionen Zeilen), stehen in spal nicht mehr die korrekten Werte, sondern Werte wie-1012781777
1134649868
-1002548789
-1019325972
1128157676
-997339628
-1012781777
1144934859
1128157676
-1019325972
1156767334
-997339628
-1012781777
1134649868Das passiert etwa bei array_pos=1,9 Millionen.
Ich hab schonmal überlegt, dass es vielleicht ein Überlauf sein könnte und hab alle int durch long ersetzt, aber das ändert nichts am Problem.Hat einer von euch sowas vielleicht schonmal gehabt, oder hätte gar eine Idee woran das liegen könnte ?
Vielen Dank,
Sebi
-
- bist du schonmal mit dem Debugger durch die while-Schleife gegangen? Setzdir einen Breakpoint rein der nach ca. 1.9 Mio hits unterbricht.
- evtl. Tippfehler in der Datei? prüf in der Schleife nicht nur auf eof(), sondern auch auf das failbit, evtl. ist eine Leseoperation schiefgegangen, danach kriegst du nurnoch müll aus dem Stream.
-
vielen Dank für die flotte Reaktion pumuckl.
Ich hab imn die Schleife mal diese Abfrage reingepackt:
if(spal[0]!=41406 && spal[1944120]!=0){ std::cout << spal[0] << endl; std::cout << array_pos << endl; exit(0); }41406 ist der Wert, den spal[1944120] korrekterweise annehmen sollte. Daher weiß ich nun, bzw. glaube zu wissen, dass bei etwa 1,9 Mio. Schluss ist.
Tippfehler in der Datei halte ich für unwahrscheinlich, weil den ersten Eintrag kenne ich ja und wenn ich ihn direkt im ersten Schleifendurchlauf ausgeben lasse, dann ist er auch korrekt erkannt, wird aber eben später mit dem Unfug überschrieben.
Eine Überprüfung auf das failbit habe ich bisher - mangels Kenntnis dessen - nicht drin. Der erste Eintrag wird zwar zunächst korrekt erfasst, aber es kann ja nicht schaden, wenn ich mal nach failbit google und das dazu implementiere.
Vielen Dank bis hier,
Sebi
-
Es muss
if(spal[0]!=41406 && spal[0]!=0){ std::cout << spal[0] << endl; std::cout << array_pos << endl; exit(0); }heißen und 41406 ist der Wert, den Spal[0] bekommen soll.
Sorry, ich hatte damit noch auf was anderes überprüft und hatte daher nicht mehr überall spal[0] stehen.
-
versuchs einfach mal testweise mit enr kleineren datei
also nur 100 einträge oder so
wenn da auch nicht alles korrekt eingelesen wird dann musst du nochmal gucken
-
Skym0sh0 schrieb:
versuchs einfach mal testweise mit enr kleineren datei
also nur 100 einträge oder so
wenn da auch nicht alles korrekt eingelesen wird dann musst du nochmal guckenDÖÖÖÖÖÖÖD! Zu spät! :p
-
Hi,
ja, bei ner kleineren (~100.000 Zeilen) geht es wunderbar.
-
Der Fehler liegt wahrscheinlich in der Leseschleife - besser ist:
while( indata >> num >> nu ){ spal[array_pos]=num; array_pos++; }Falls nämlich bein Einlesen ein Fehler auftritt, so bricht Deine Schleife nicht ab, da das EOF-Flag nicht gesetzt wird (warum sollte es auch), aber 'num' wird nicht mehr mit sinnvollen Werten gefüllt, sondern behält den ursprünglichen Wert.
Die Abfrage auf EOF vor(!) dem Einlesen ist ein Unsitte, die aber anscheinend in vielen Lehrbüchern steht.
-
sebig schrieb:
Tippfehler in der Datei halte ich für unwahrscheinlich, weil den ersten Eintrag kenne ich ja und wenn ich ihn direkt im ersten Schleifendurchlauf ausgeben lasse, dann ist er auch korrekt erkannt, wird aber eben später mit dem Unfug überschrieben.
Der erste Eintrag wird auch nicht das Problem sein. Eher einer bei ca. 1.9 Millionen (der, wonach nurnoch Mist gelesen wird).
Wie gesagt, versuchs mal mit dem Debugger.
Ansonsten können wir nur raten. Was du uns bisher gezeigt hast lässt nicht erkenne, ob du eventuell irgendwo einen Fehler im Programm hast. Übliches Vorgehen: reduziere dein Programm auf das wesentliche, so dass es immernoch den Fehler produziert, und poste den reduzierten Code dann komplett hier rein.
-
Ich wette, der Stream geht zwischendurch einfach kaputt. Prüfe mit bad(), ob das badbit (Stream nicht okay) gesetzt ist und erneue ihn. Probier auch mal fail(), wenn beim Lesen was schiefging. Debuggen!

-
Nimm doch mal die ersten 1.5 Mio Zeilen und verdoppele sie (StrgC-StrgV).
Tritt der Fehler dann weiter bei 1.9 Mio oder bei 3.4 Mio auf?