Hallo zusammen!
ich bin neulinge in c++ und vesuche zwei classen Input und saveload
zuschreiben; in input soll Funktionswerte(x und y),die ich später
plotten möchte,ausgewertet. in zweite class saveload soll die Daten
geschrieben bzw. gelesen werden und der Pfade soll über konsole
eigegeben .
kann jamend mein Code kurz angucken und mir tipps geben wie ich das zum
laufen krigen kann;
hier ist Project.h
1
tructXYpair{
2
doublex;
3
doubley;
4
XYpair(doublex,doubley):x(x),y(y){}
5
};
6
7
classINPUT{
8
9
private:
10
intpsize;
11
doublexmin,xmax;
12
intwahl;
13
std::vector<XYpair>dptr;
14
public:
15
voidsetvalue();
16
std::vector<XYpair>Dataplot(intpsize);
17
intmenu();
18
};
19
classSaveload{
20
private:
21
ifstreamidatei;
22
ofstreamodatei;
23
std::vector<XYpair>Vp;
24
charpfad[200];
25
public:
26
voidsave(intn,std::vector<XYpair>);
27
std::vector<XYpair>load();
28
};
29
#endif
Abschitt von project.cpp
1
std::vector<XYpair>INPUT::Dataplot(intpsize){
2
3
doublexr=(double)(xmax-xmin)/psize;
4
doubleX=xmin;
5
inti;
6
std::vector<XYpair>dptr;
7
X=xmin;
8
for(i=0;i<psize;i++){
9
dptr.push_back(XYpair(X,sin(X)));
10
X+=xr;
11
}
12
returndptr;
13
}
14
15
voidSaveload::save(intn,std::vector<XYpair>v){
16
17
std::vector<XYpair>Vp;
18
inti;
19
for(i=0;i<=n-1;i++){
20
Vp[i]=v[i];
21
}
22
23
cout<<"Unter welchem Pfadname soll es gepeichert werden?"<<endl;
24
cin>>pfad;
25
idatei.open(pfad,ios::in|ios::binary);
26
27
if(!idatei){cout<<"Fehler beim Öffnen neuer Datei"<<endl;}
28
29
idatei.read(Vp,sizeof(Vp)/sizeof(Vp[0]));
30
31
idatei.close()
32
}
33
34
std::vector<XYpair>Saveload::load(){
35
intn;
36
cout<<"von welchem Pfad soll ausgelesen werden"<<endl;
37
cin>>pfad;
38
39
odatei.open(pfad,ios::out|ios::binary);
40
41
if(!odatei){cout<<"Fehler beim Öffnen der Datei"<<endl;}
42
std::vector<XYpair>ptr;
43
odatei.write(Vp,size(n));
44
for(i=0;i<n;i++)
45
ptr[i]=Vp[i];
46
odatei.close();
47
returnptr;
48
}
Abschitt von main.cpp
1
intmain(){
2
intWahl;
3
intpsize=15;
4
std::vector<XYpair>V;
5
6
NPUTfdata;
7
Saveloadpdata;
8
Wahl=fdata.menu();
9
if(Wahl==1){
10
fdata.setvalue();
11
V=fdata.Dataplot(psize);
12
pdata.save(psiz,V);
13
}
14
elseif(Wahl==2){
15
16
V=pdata.load();
17
for(inti=0;i<psize-1;i++){
18
cout<<"V.x"<<V[i].x<<"V.y"<<V[i].y<<'\n';
19
}
meine probleme sin eigentlich beim Lesen und schreiben , ich habe da
mehrere syntax Fehler.
ich bin für jeder Hilfe sehr dankbar .
Gruß
Seb
Beitrag "GNU Libmatheval in C++ Programm anwenden"
1. std::vector direkt lesen oder schreiben geht nicht. Du musst jedes
Element einzeln lesen/schreiben (und bei einem zusammengesetzten typ,
z.B struct wieder die Elemente einzeln lesen/schreiben)
2. zeile 52 fehlt ein ;
3. size(n) evtl sizeof(n)?
4. i was not declared... compiler hat recht..
5. load und save namen sind vertauscht? load=write, save=read?
Und noch ein Tipp:
Beim Speichern von Daten, ist es eine extrem gute Idee, wenn man vor die
Daten erst mal rausschreibt, wieviele Daten denn überhaupt geschrieben
werden.
Eine extrem gute Idee ist das deshalb, weil man dann beim Einlesen erst
mal diese Anzahl einliest und dann weiß, wieviele Datensätze im File
noch kommen werden.
Beim Schreiben einer Datei muss man sich in der Datei die Informationen
reinschreiben, die später beim Lesen der Datei zur Steuerung des
Lesevorgangs genutzt werden.
if(!idatei){cout<<"Fehler beim Öffnen neuer Datei"<<endl;}
4
5
idatei.read(Vp,sizeof(Vp)/sizeof(Vp[0]));
ist ja schön, wenn du deinem Benutzer mitteilst, dass du die Datei nicht
öffnen konntest. Nur: Auf eine nicht geöffnete Datei kann man auch nicht
schreiben/lesen. D.h. du musst das natürlich auch berücksichtigen, dass
du einen Fehler hattest und dass du deshalb nichts Schreiben lesen
kannst.
(Und eventuell sollte das auch der Aufrufer der Funktion wissen, dass da
was schief gelaufen ist, damit der dann wiederrum nicht einen
fehlerhaften std::vector in die Auswertung weitergibt)
Karl Heinz Buchegger schrieb:> Und warum du da in den Funktionen jedesmal den std::vector erst mal> durch die Gegend kopierst, musst du mir auch erst mal erklären.
ich denke mal das ich die daten in eine Buffer erstmal schreibe .
Karl Heinz Buchegger schrieb:> Und noch ein Tipp:>> Beim Speichern von Daten, ist es eine extrem gute Idee, wenn man vor die> Daten erst mal rausschreibt, wieviele Daten denn überhaupt geschrieben> werden.>> Eine extrem gute Idee ist das deshalb, weil man dann beim Einlesen erst> mal diese Anzahl einliest und dann weiß, wieviele Datensätze im File> noch kommen werden.>> Beim Schreiben einer Datei muss man sich in der Datei die Informationen> reinschreiben, die später beim Lesen der Datei zur Steuerung des> Lesevorgangs genutzt werden.
void Saveload::save(int n, std::vector<XYpair> v)
n ist die Anzhal der Byte der ich schreiben möchte
read() erwartet ein char* und frage mich wie kann ich die std::vector
übergebe
gerbej seb schrieb:> Karl Heinz Buchegger schrieb:>> Und warum du da in den Funktionen jedesmal den std::vector erst mal>> durch die Gegend kopierst, musst du mir auch erst mal erklären.>> ich denke mal das ich die daten in eine Buffer erstmal schreibe .
Wozu?
>> Beim Schreiben einer Datei muss man sich in der Datei die Informationen>> reinschreiben, die später beim Lesen der Datei zur Steuerung des>> Lesevorgangs genutzt werden.>> void Saveload::save(int n, std::vector<XYpair> v)> n ist die Anzhal der Byte der ich schreiben möchte
OK. Kann man so machen. Muss man aber nicht. Der std::vector weiß selber
wie gross er ist. Du brauchst ihn nur 'fragen'. Dieselbe Information
(nämlich die Anzahl der Wertpaare) 2 mal im System zu haben, ist immer
ein 'Ask for trouble'. Alte Datenbankweisheit: Speichere dieselbe Info
niemals 2 mal ab. Im besten Fall passiert nichts. Im schlimmsten Fall
stimmen die beiden Angaben nicht überein. Welche der beiden stimmt denn
dann?
Und rechne besser nicht damit, dass du immer den besten Fall vorliegen
hast.
>> read() erwartet ein char* und frage mich wie kann ich die std::vector> übergebe
gar nicht.
Du liest 2 double ein (denn die hast du auch geschrieben), konstruierst
daraus ein XYPair Objekt, welches du mit push_back an den std_vector
anhängst.
Und genauso kannst du den std::vector nicht einfach in write
hineingeben, sondern musst das Element für Element machen. Ein Element
nach dem anderen aus dem std::vector herausholen und die Werte dieses
Elements in die Datei schreiben.
Das hat aber xgast kurz vor 19:00 schon angemerkt.
Hast du denn kein C++ Buch?
Ich wiederhole es gerne nochmal: Online Tutorien sind kein Ersatz für
ein ordentliches Buch!
Und ehe du dich an binären Files versuchst, schlage ich vor, dass du
erst mal ganz normale Text-Files erstellst und wieder einliest. Denn
dann kannst du mit jedem ordinären Texteditor kontrollieren, ob das
File, das du geschrieben hast auch wirklich in Ordnung ist. In deinem
Stadium ist nichts schlimmer als Stochern im Nebel, weil du nicht weißt
ob dein Einlese-Code falsch ist oder ob der Rausschreiben-Code schon
eine ungültige Datei erzeugt hat.