Sogar mein Prof kanns sichs nicht erklären.....[fread maximal 50 werte]
-
Hallo liebe C/C++-Forum Helfer und Hilfesuchenden,
momentan stehe ich wirklich vor einem Rätsel !!
Ich habe eine Klasse erstellt namens Caktie, mit welcher es möglich ist, einer Aktie auf 100 Tagen "pseudo"-werte zu zuweisen. Diese 100 Werte werden auch wunderbar ermittelt und auch prima ausgegeben.Wenn es jetzt jedoch zum Abspeichern mittels "fwrite" und wieder auslesen mittels "fread" kommt, werden nur 50 korrekte Werte, anstatt 100 angezeigt.
...
45) 45.4187
46) 66.7926
47) 52.3296
48) 93.7876
49) 51.3682
50) 89.0534
51) 5.60519e-45
52) 4.2039e-45
53) 7.77754e+33
54) 7.78071e+33
55) 5.6133e-39
...Habe schon mit jeglichen Werten rumhantiert, jedoch ohne Erfolg.
Post des Programmes als Projekt:
MAIN:
#include <iostream> #include <stdlib.h> #include "aktie.h" void main(void) { Caktie A1; //Namen erfahren A1.get_name(); //Werte zuweisen A1.get_kurse(); cout<<"___________________________________________________________"; cout<<"\n\n\t\tAusgabe der Kursliste "<<endl; cout<<"___________________________________________________________"; A1.put_kursliste(); A1.put_data(); A1.out_data(); system("PAUSE"); }
HEADER-DATEI aktie.h:
/* Headerdatei für Klasse Caktie */ #include <stdio.h> #ifndef AKTIEHEADER #define AKTIEHEADER class Caktie { private: FILE *fp,*fp2; char * name; // Name der Aktie float * feld; // Kurse der letzten 100 Tage float min, max; // niedrigster und höchster Kurs void initialize_aktie(); public: Caktie(); ~Caktie(); void get_name(); // Eingabe eines Aktiennamens void get_kurse(); // Generieren einer Spielliste void put_kursliste(); // Ausgabe der Kursentwicklung void put_data(); void out_data(); }; #endif
IMPLEMENTIERUNG:
/* Implementierungsdatei zur Klasse Caktie */ #include <iostream.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "aktie.h" void Caktie::initialize_aktie() { name = NULL; feld = new float[100]; min = -1; max = -1; } Caktie::Caktie() //Konstruktor { initialize_aktie(); } Caktie::~Caktie() //Destruktor { delete [] name; delete [] feld; } void Caktie::get_name() //Eingabe "Name Aktie" { char text[255]; cout << "\nTitel? "; if (cin.peek() == '\n') cin.get(); cin.get(text, 255); name = strdup(text); } void Caktie::get_kurse() // Generieren einer Spielliste { /* Statt der Eingabe von Kursen, eine automatische Generierung */ for (int i=0; i<100; i++) { feld[i]=40*sin((float)i/40)+20*(float) rand()/10000; } } //Ausgeben der Werte void Caktie::put_kursliste() {int i,zaehler=0; cout<<"\n\n"<<endl; for(i=0;i<100/3;i++) { cout<<i+zaehler+1<<") "<<feld[i+zaehler]<<"\t"<<i+2+zaehler<<")\t"<<feld[i+1+zaehler]<<"\t"<<i+3+zaehler<<") "<<feld[i+2+zaehler]<<endl; zaehler=zaehler+2; } cout<<"100) "<<feld[99]; } //Datei anlegen mit den Werten der Aktie void Caktie::put_data() {char test; cout<<"\nputdata"<<endl; fp=fopen("aktienkurse.txt","w+"); fwrite(feld,1,400,fp); fclose(fp); } //Auslesen der Datei und ausgeben void Caktie::out_data() {float txt[100]; cout<<"\nNun werden die Daten ausgelesen aus der Datei und ausgegeben : "<<endl; fp2=fopen("aktienkurse.txt","r"); fread(txt,1,400,fp2); for(int i=0; i<100; i++) cout<<i<<")\t"<<txt[i]<<endl; }
Wir (Professor und ich), spekulieren über einen Fehler im Dev-C++ Kompiler.
Hatte leider bisher nicht die Möglichkeit es in einem anderem zu versuchen.Ich wärte um Rat dankbar
-
wer c und c++ derart mischt ist selber schuld wenn solche probleme auftauchen... solltest dich mal für eins entscheiden...
-
Du musst die Datei natürlich binär öffnen und nicht im Textmodus. Das heißt "rb" bzw. "w+b" als Modus bei fopen übergeben. Vergiß Windalfs unqualifizierten Kommentar.
-
die änderungen, die ich machen muss, damit mein compiler es frisst:
int main statt void main
vor int main einfügen von using namespace std;daraufhin kommt diese ausgabe:
Titel? Bauhaus ___________________________________________________________ Ausgabe der Kursliste ___________________________________________________________ 1) 0.082 2) 37.9339 3) 14.6672 4) 55.9972 5) 42.3313 6) 36.435 7) 28.9335 8) 65.6803 9) 61.8708 10) 57.8523 11) 21.3062 12) 67.1519 13) 58.3828 14) 46.4263 15) 33.6379 16) 15.6329 17) 21.5667 18) 40.3768 19) 27.0526 20) 29.1655 21) 83.959 22) 49.2565 23) 28.7115 24) 22.0594 25) 23.1697 26) 48.1679 27) 59.0495 28) 62.4279 29) 65.2047 30) 66.3154 31) 38.1595 32) 71.4406 33) 58.2362 34) 52.4579 35) 33.7892 36) 70.5257 37) 82.6671 38) 84.5428 39) 66.6066 40) 52.8961 41) 91.0648 42) 81.8106 43) 97.3409 44) 95.8496 45) 70.9943 46) 45.4187 47) 66.7926 48) 52.3296 49) 93.7876 50) 51.3682 51) 89.0534 52) 93.5508 53) 103.866 54) 104.312 55) 79.1029 56) 64.9537 57) 56.864 58) 59.0576 59) 94.7665 60) 41.3726 61) 64.5318 62) 46.0281 63) 84.3714 64) 43.6836 65) 40.5589 66) 100.153 67) 57.9546 68) 57.667 69) 78.1946 70) 84.8214 71) 94.2514 72) 86.7789 73) 70.7339 74) 52.1726 75) 87.191 76) 68.8634 77) 67.864 78) 99.7189 79) 85.9444 80) 43.8726 81) 75.6299 82) 61.1904 83) 83.6625 84) 74.9304 85) 72.0404 86) 57.6928 87) 43.408 88) 47.6702 89) 60.2019 90) 84.3573 91) 65.0109 92) 95.3631 93) 79.0802 94) 51.7987 95) 39.5329 96) 70.8234 97) 59.2545 98) 30.4368 99) 71.3686 100) 57.8145 putdata Nun werden die Daten ausgelesen aus der Datei und ausgegeben : 0) 0.082 1) 37.9339 2) 14.6672 3) 55.9972 4) 42.3313 5) 36.435 6) 28.9335 7) 65.6803 8) 61.8708 9) 57.8523 10) 21.3062 11) 67.1519 12) 58.3828 13) 46.4263 14) 33.6379 15) 15.6329 16) 21.5667 17) 40.3768 18) 27.0526 19) 29.1655 20) 83.959 21) 49.2565 22) 28.7115 23) 22.0594 24) 23.1697 25) 48.1679 26) 59.0495 27) 62.4279 28) 65.2047 29) 66.3154 30) 38.1595 31) 71.4406 32) 58.2362 33) 52.4579 34) 33.7892 35) 70.5257 36) 82.6671 37) 84.5428 38) 66.6066 39) 52.8961 40) 91.0648 41) 81.8106 42) 97.3409 43) 95.8496 44) 70.9943 45) 45.4187 46) 66.7926 47) 52.3296 48) 93.7876 49) 51.3682 50) 89.0534 51) 5.74532e-042 52) 3.21383e-039 53) 7.79838e+033 54) 7.71243e+033 55) 2.38772e-038 56) 5.60197e-039 57) 3.21341e-039 58) 0 59) 3.21375e-039 60) 1.01223e+034 61) 9.90234e+033 62) -1.#QNAN 63) 9.92067e+033 64) 9.92663e+033 65) 0 66) 4.2039e-045 67) 7.77754e+033 68) 7.78071e+033 69) 5.6133e-039 70) 7.77765e+033 71) 4.2039e-045 72) 7.77767e+033 73) 0 74) 7.89697e+033 75) 1.#QNAN 76) 0 77) 3.21373e-039 78) 7.79838e+033 79) 3.21387e-039 80) 7.79838e+033 81) 7.7125e+033 82) -1.#QNAN 83) 7.77767e+033 84) 7.82288e+033 85) 7.80891e+033 86) 5.61601e-039 87) 7.81197e+033 88) 2.66247e-044 89) 7.82295e+033 90) 7.89697e+033 91) 7.82293e+033 92) 1.4013e-045 93) 1.01131e+034 94) 1.#QNAN 95) 0 96) 3.21384e-039 97) 1.4013e-045 98) 3.2142e-039 99) 7.79838e+033 Drücken Sie eine beliebige Taste . . .
wie man sieht, sind lauter 1.#QNAN und so schrottige dinge drin.
oder mal die ausgabe 95 angucken. die 0 war aber nicht eingabe.mal die datei angucken:
zï§=O¼B·¬jAý_BJS)Bn½BÜwçAT\ƒB¬{wBµhgBsªAÃM┼Bÿ╬iB´9B9_B] zA¬^¬Aà_!BÅkØASéAë§BEB!±åA¢y°A<[¹Aì«@B¥2lB)¶yBÏh'B~¡"Ba£BoáZBêñhBçÔQB((B. _B<U¥Bî©B-6.BSB3!¶BY£BZ®ÂB
hä???
was hat ihr denn da verbrochen?mann, mann, mann. man schribt doch daten nicht mehr so platt binär.
open ,"w+b" bzw. "rb"
das hat man doch augenblichlich debuggt. darf ich deinem prof programmieren beibringen?
-
ja, ich wunder mich auch weshalb mein Herr Prof da net drauf gekommen ist, aber nun haben wir (bzw. ich) wieder was gelernt
dangöööööö @ Bashar & volkard
-
Dein Prof. ist ein noob, er soll sich den Standard angucken und nicht ISO C++ mit ANSI C mischen!
-
zï§=O¼B·¬jAý_BJS)Bn½BÜwçAT\ƒB¬{wBµhgBsªAÃM┼Bÿ╬iB´9B9_B] zA¬^¬Aà_!BÅkØASéAë§BEB!±åA¢y°A<[¹Aì«@B¥2lB)¶yBÏh'B~¡"Ba£BoáZBêñhBçÔQB((B. _B<U¥Bî©B-6.BSB3!¶BY£BZ®ÂB
Erinnert mich spotan an Exe Codes
Devil
-
nix da schrieb:
Dein Prof. ist ein noob, er soll sich den Standard angucken und nicht ISO C++ mit ANSI C mischen!
Ich weiß gar nicht was du hast er hat doch gar kein ISO C++ benutzt
Edit:
Achja in deinem ersten Codestück fehlt bei #include<iostream> das .h
-
SirLant schrieb:
Achja in deinem ersten Codestück fehlt bei #include<iostream> das .h
Perverses stück Dreck
-
@SirLant: Provokateur :p;)
MfG SideWinder
-
Dass an dem Code rumgemäkelt wird ist ja ok, hat aber nichts mit dem Fehler zu tun.
Das sieht hier so aus, als würde der Compiler 8 Byte (statt der üblichen 4) für ein Float verwenden. Dann reichen die festen 400 Byte nur für 50 Werte.
Der eigentliche Fehler ist also diese Konstante zu benutzen statt sizeof().
-
nix da schrieb:
Dein Prof. ist ein noob, er soll sich den Standard angucken und nicht ISO C++ mit ANSI C mischen!
Meiner Erfahrung nach haben die meisten Akademiker Probleme mit sowas. Das sind Theoretiker, die Studenten coden lassen. Das ist übrigens wertungsfrei gemeint, auch wenn es nicht so klingen mag ... bin ja selber Theoretiker, aber ich bilde mir ein, meine Grenzen zu kennen.
BTW, wenn du die Stelle findest, an der hier ANSI-C reingemischt wurde, geb ich dir ein virtuelles Bier aus. Ich seh überall nur Prä-Standard-C++.
-
Und ich mail dir dann nen Burger zu.
-
nix da schrieb:
SirLant schrieb:
Achja in deinem ersten Codestück fehlt bei #include<iostream> das .h
Perverses stück Dreck
SideWinder schrieb:
@SirLant: Provokateur :p;)
MfG SideWinder
Also bei mir würde dieses Codestück nicht kompilieren ohne dem .h