Fehler beim Einlesen/Speichern einer Textdatei
-
Hallöchen,
ich habe beim Programmieren meines Programms Fehler. Der Fehler liegt einfach darin, dass das Programm meine Textdatei nicht richtig liest und/oder es nicht richtig ausgibt und/oder es nicht richtig in ein Array speichern kann.
Man gibt einfach die Zeile an, ab der und bis dahin gezählt werden soll. Diese Daten sollen dann in einem Array gespeichert werden (Mann könnte das ganze Programm eleganter lösen, mit Rückgabeparameter und Vectoren usw. aber ich wollte das erstmal so machen)
Ich bekomme zwar Zahlen, aber die sind falsch. Den Fehler finde ich aber nicht.
Hier ist der Code://globale Deklaration und Initialisierung der Parameter double Daten[100000], Sort[100000]; //Array für die Daten groß genug wählen double Mittelwert=0,Maximalwert=0,Minimalwert=0,Medianwert=0,Standartabweichung=0; int Datenanzahl=0, x=0; // x ist Laufvariable void Einlesen() { int startwert_daten=0, endwert_daten=0; char c; ifstream Datenreihe("C:\\Datenreihe-01.txt"); cout<<"Geben sie die Startzeilennummer ein, ab der die Daten berechnet werden sollen und bestätigen Sie mit Enter."<<endl; cin>>startwert_daten; //Eingabe des Startwertes cout<<"Geben sie die Endzeilennummer ein, bis zu der berechnet werden soll und bestätigen Sie mit Enter. (Max. Zeilenzahl=99999)"<<endl; cin>>endwert_daten; //Eingabe des Endwertes Datenanzahl = endwert_daten - startwert_daten + 1; //Berechnung der vorhandenen Datenanzahl for(x=1;x<startwert_daten;x++) //Weglesen der Daten bis zum Startwert { Datenreihe>>c; //cout<<"C: "<<c<<endl<<endl; } for(x=1;x<=Datenanzahl;x++) //Speichern der Datenreihe im Array { Datenreihe>>Daten[x]; Sort[x]=Daten[x]; //Datenreihe zum sortieren speichern cout<<"daten_x:"<<Daten[x]<<endl; //Ausgabe der Daten zur Prüfung } getch(); }Woher weiß ich das? Ich kann ja die Textdatei öffnen und mit den ausgegebenen Werten vergleichen. Die sind nicht identisch...
edit: Datenreihe.close() und die doppelte for-Schleife wurden entfernt.
-
was mir als erstes auffällt, ist folgendes:
for(x=1;x<=Datenanzahl;x++) //Speichern der Datenreihe im Array { for(x=1;x<=Datenanzahl;x++) { Datenreihe>>Daten[x]; Sort[x]=Daten[x]; //Datenreihe zum sortieren speichern cout<<"daten_x:"<<Daten[x]<<endl; //Ausgabe der Daten zur Prüfung } }warum nutzt du dieses konstrukt?o.O macht keinen sinn^^
zumal einfor(int x=1;x<=Datenanzahl;x++)auch irgendwie besser zu lesen wäre^^ (und auhc gängige form ist)
-
Also ich sehe da keinen Fehler. Bei mir machts mal genau das, das du willst. Wie sieht deine Datei aus?
Ich habs ausgetestet mit Startwert 2, Endwert 10 und folgender File:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Und ja, die innere for-Schleife macht keinen Sinn.
-
Ja, eine doppelte for-Schleife macht keinen Sinn...Hmmm, die is weg.
Das ist ein Teil meiner Datenreihe2.629047437 2.36151741 2.148527167 2.179358509 2.410938306 2.175773803 2.001988031 2.330432407 2.151604774 2.159393912 2.251070034 2.102377046 2.358980503 1.895159115 1.810490532 2.534970835 2.509404754 2.756000896 2.627013337 2.42686611 2.423600968 2.61203175 2.531642209 1.699016583 2.593400598 2.023174805 2.085366795 2.325872781 2.196786756 2.561391992 2.245562417 1.692697802 1.73038663 2.125472948 1.783229976 2.656326519 1.830159194 1.79729102 2.149511844 2.612766942 2.382594145 2.579497535 2.054951064 2.121247737 2.320436235 2.081892243Nehme ich hier zB. 4 und 6 bekomme ich: 2,9...*10^7; 2,36152 und 2,14853
Diese 3 Zahlen sind aber nicht in der 4.,5. und 6.Reihe vorhanden. In der 1. und 2. Zeile sind die da...aber warum werden die denn ausgegeben? Und woher kommt die 1.Zahl.
Manchmal bekomme ich auch, bei höheren Werten (Ich habe 2000 Daten) eine 56... Es existiert aber keine 56...
-
wie wärs damit, während du die zahlen überspringst, nicht chars sondern...hmm... doubles einzulesen?
-
Joa, dann bekommt man eine Lösung -.- Die dann korrekt sein sollte...
Bei mir ist die grad um eine Zeile nach oben verrutscht, liegt aber daran, dass meine Zeilennummerierung nicht das macht, was es mache soll.
Das ist aber ein anderes Thema -.-
-
Schau, du nimmst z.B. Startwert und Endwert = 2. Dann willst du ja 2.629047437 überspringen. Da du aber einen intergralen Typen verwendest, um die Zeilen zu überspringen, passiert folgendes:
Es wird nur die 2 gelesen, und .629047437 bleibt zurück. Beim nächsten Lesen hast du dann 0.629047437 statt 2.36151741.Und wir hatten doch vorhin geklärt, dass Datenreihe.close() unnötig ist.
-
Gugelmoser schrieb:
Schau, du nimmst z.B. Startwert und Endwert = 2. Dann willst du ja 2.629047437 überspringen. Da du aber einen intergralen Typen verwendest, um die Zeilen zu überspringen, passiert folgendes:
Es wird nur die 2 gelesen, und .629047437 bleibt zurück. Beim nächsten Lesen hast du dann 0.629047437 statt 2.36151741.Darauf hätte man selber kommen können...
Und wir hatten doch vorhin geklärt, dass Datenreihe.close() unnötig ist.
Datenreihe.close()
wo??? 
-
Datenreihe.close()
wo??? 
Scherzkeks.Wenn du jetzt noch
-die globalen Variablen lokal machst.
-in der for-Schleife int x=1 und ++x schreibst.
-getch() zum Teufel jagst und statdessencin.ignore(999999,'\n'); cin.get();schreibst, ist der Codeausschnitt ganz annehmbar.
-
Du meinst doch nicht etwa
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); std::cin.get();?

-
Hehehehe. Eigentlich wollte ich noch schlafen, schließlich muss ich noch um 6.30Uhr ausm Haus. Aber wenn ich solch eine kompetente und schnell Hilfe bekomme und das Programm dann auch noch läuft, dann kann man einfach nicht schlafen gehen

Das mit den globalen Variablen ist ein Problem: Ich brauche diese Variablen auch in anderen Funktionen, dann müsste ich also mit Rückgabeparametern oder überall mit globalen Variablen arbeiten.
Gilt dass int in der for-Schleife auch für mein startwert_daten?
-
cooky451 schrieb:
Du meinst doch nicht etwa
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); std::cin.get();?

Nicht zu vergessen: #include <limits>. 
-
Einstein jr. schrieb:
Gilt dass int in der for-Schleife auch für mein startwert_daten?
Wie meinst du das? Das int bezieht sich nur auf x.
for(int x=1; ... ; ++x) // x ist nun eine lokale Variable, also nur in der for-Schleife sichtbar.
-
Gugelmoser schrieb:
Einstein jr. schrieb:
Gilt dass int in der for-Schleife auch für mein startwert_daten?
Wie meinst du das? Das int bezieht sich nur auf x.
for(int x=1; ... ; ++x) // x ist nun eine lokale Variable, also nur in der for-Schleife sichtbar.Die Frage war hat sich erledigt. Danke.
-
ist es in diesem fall nicht egal, ob man
for(int x=1; ... ; ++x) // x ist nun eine lokale Variable, also nur in der for-Schleife sichtbar.oder
for(int x=1; ... ; x++) // x ist nun eine lokale Variable, also nur in der for-Schleife sichtbar.schreibt?
-
ja, an dem erzeugten code wird sich in diesem fall wohl nichts ändern.