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ë§B­EB!±å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ë§B­EB!±å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 🤡


Anmelden zum Antworten