"Anders Jensen" <linus@post2.tele.dk> wrote in message
news:3bc80b52$0$261$edfadb0f@dspool01.news.tele.dk...
> Jeg håber der er nogen i gruppen - Der kan forklare/løse følgende (
> formentligt banale ) problem for mig i VC++ ( Med forhåndsundskyldning for
> min programeringstil )
Hvorfor underskylder du den ?
Skriv koden på en ordentlig måde i stedet for. Det er nemt.
Computeren kan godt find ud af at forstå grimt formateret kode, men
mennesker kan ikke.
Hold en konsistent stil.
Så er den nemmere at læse og dermed at få til at virke.
> Når nedenstående programstump kører - opstår der følgende problem: Jeg kan
> ikke forstå hvorfor
> 1.39067e-308 opstår - på den plads skulle 3.25 da gerne stå ??
>
Kort fortalt:
Du skal åbne dine output filestream for binær tilgang, når du bruger den som
du gør
> #include <fstream.h>
Der hedder <fstream> i Standard C++
>
> void midlav(int antal)
> { int t,buffer; double s;buffer=8;
Variablen buffer bruges aldrig - giver din compiler ikke en warning ?
Erklær variablene så tæt på hvor de bruges som muligt
> ofstream start_fil("TEMP.DAT");
> start_fil.seekp(0); s = 1;
> start_fil.write((char *)&s,sizeof(s));
Foretræk at bruge C++ cast i stedet.
Her "reinterpret_cast"
> for (t=1;t<(antal+4);t++)
Hvor stammer 4 fra ?
Er det en sikkerhedsmargin fordi du ikke er sikker på hvad der sker ?
Foretræk, idiomatisk, at bruge ++t i stedet t++
> {start_fil.seekp(8*t);s = 6;
hvor stammer 8 fra ? sizeof(double) ?
Så skriv det i stedet
> start_fil.write((char *)&s,sizeof(s));}start_fil.close(); }
Det er overflødigt at lukke filen - det klares i destructoren
>
>
> void se(int antal)
> {int t,buffer;double a;buffer=8; for (t=0;t<antal;t=t+1)
Hvorfor bruger du en anden stil til at incrementere "t" her ?
> {ifstream m1_fil("TEMP.DAT");m1_fil.seekg(t*8);
hvorfor åbner du streamen for hvert loop ?
> m1_fil.read((char *)&a,sizeof(a));cout<< " "<<a;m1_fil.close();} }
>
> void main(void)
main returnerer altid int
> { double a; int t;
>
> midlav(6);
> se(6);cout<<endl;
>
> t=16;
Hvor stammer 16 fra ?
2*sizeof(double) ?
Så skriv det
> ofstream ud_fil("TEMP.DAT",ios::in);
Hvorfor åbner du en output file stream for input ?
> ud_fil.seekp(t);a=3.25;
> ud_fil.write((char *)&a,sizeof(a));
> ud_fil.close();
> se(6);cout<<endl;
>
> t=24;
Hvor stammer 24 fra ?
> ofstream ud2_fil("TEMP.DAT",ios::in);
> ud2_fil.seekp(t);a=3.25;
> ud2_fil.write((char *)&a,sizeof(a));
> ud2_fil.close();
> se(6);cout<<endl; }
>
Og vupti - så har du noget ISO C++ kode, som er let at læse, uden magiske
konstanter med fuld fejlhåndtering og som kører på enhver platform med en
anstændig C++ compiler (og et filsystem).
#include <iostream>
#include <fstream>
#include <exception>
#include <cstdlib>
const std::ios_base:
enmode OUT_OPEN_MODE = std::ios_base::in |
std::ios_base::out | std::ios_base::binary;
template <typename T>
inline void write_at_pos(const T& t, size_t pos, std::ostream& os)
{
os.seekp(pos*sizeof(T), std::ios_base::beg);
os.write(reinterpret_cast<const char*>(&t), sizeof(T));
}
void midlav(size_t antal)
{
std::ofstream os("TEMP.DAT", OUT_OPEN_MODE);
os.exceptions(std::ios_base::badbit | std::ios_base::failbit);
double d = 1;
for(size_t i = 0; i != antal; ++i) {
write_at_pos(d, i, os);
d = 6;
}
}
void se(size_t antal)
{
std::ifstream is("TEMP.DAT", std::ios_base::binary);
is.exceptions(std::ios_base::badbit | std::ios_base::failbit);
for (size_t i=0; i != antal; ++i) {
double d;
is.read(reinterpret_cast<char*>(&d), sizeof(d));
std::cout << " " << d;
}
}
int main(void)
{
try {
midlav(6);
se(6);
std::cout << std::endl;
{
std::ofstream ud_fil("TEMP.DAT", OUT_OPEN_MODE);
ud_fil.exceptions(std::ios_base::badbit | std::ios_base::failbit);
double d = 3.25;
write_at_pos(d, 2, ud_fil);
}
se(6);
std::cout << std::endl;
{
std::ofstream ud_fil("TEMP.DAT", OUT_OPEN_MODE);
ud_fil.exceptions(std::ios_base::badbit | std::ios_base::failbit);
double d = 3.25;
write_at_pos(d, 3, ud_fil);
}
se(6);
std::cout << std::endl;
return EXIT_SUCCESS;
}
catch(std::exception& x) {
std::cerr << x.what();
return EXIT_FAILURE;
}
}
Venlig hilsen
Mogens Hansen