/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
newbie:filproblem i VC++?
Fra : Anders Jensen


Dato : 13-10-01 10:40

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 )
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å ??

#include <fstream.h>

void midlav(int antal)
{ int t,buffer; double s;buffer=8;
ofstream start_fil("TEMP.DAT");
start_fil.seekp(0); s = 1;
start_fil.write((char *)&s,sizeof(s));
for (t=1;t<(antal+4);t++)
{start_fil.seekp(8*t);s = 6;
start_fil.write((char *)&s,sizeof(s));}start_fil.close(); }


void se(int antal)
{int t,buffer;double a;buffer=8; for (t=0;t<antal;t=t+1)
{ifstream m1_fil("TEMP.DAT");m1_fil.seekg(t*8);
m1_fil.read((char *)&a,sizeof(a));cout<< " "<<a;m1_fil.close();} }

void main(void)
{ double a; int t;

midlav(6);
se(6);cout<<endl;

t=16;
ofstream ud_fil("TEMP.DAT",ios::in);
ud_fil.seekp(t);a=3.25;
ud_fil.write((char *)&a,sizeof(a));
ud_fil.close();
se(6);cout<<endl;

t=24;
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; }

//OUTPUT:
// 1 6 6 6 6 6 6
// 1 6 3.25 6 6 6
// 1 6 1.39067e-308 3.25 6 6


--
LINUS
linus@post2.tele.dk



 
 
Mogens Hansen (13-10-2001)
Kommentar
Fra : Mogens Hansen


Dato : 13-10-01 15:09


"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





Anders Jensen (13-10-2001)
Kommentar
Fra : Anders Jensen


Dato : 13-10-01 16:47

Først mange mange Tak for svaret - Og det var en enorm hjælp, at du havde
ulejliget dig med at "retskrive" teksten - den kører frit og glat
Årsagen til, at den renskrevne tekst hjalp så meget er, at mange at
rettelserne - Når de er blevet rettet enkelvis udløser "underlig" opførsel
fra compileren ( MS VC ++ 6.0 )
Nu har jeg mulighed for, at lærer af mine fejl på noget der virker - Tak
igen.

> Hvorfor underskylder du den ?

Fordi jeg på et tidspunkt blev "overfaldet" på min E-mail af nogen - hvis
budskab det vist nok var, at " ægte/rigtig" C++ - kode var noget der var
kompiler uafhængigt.


--
LINUS
linus@post2.tele.dk






Niels (14-10-2001)
Kommentar
Fra : Niels


Dato : 14-10-01 22:21


>
> Fordi jeg på et tidspunkt blev "overfaldet" på min E-mail af nogen - hvis
> budskab det vist nok var, at " ægte/rigtig" C++ - kode var noget der var
> kompiler uafhængigt.
>



Det er da vist meget simple programmer, som ikke "læner" sig op af
platform + compiler... ??? er det ikke? ja det er nærmere et spørgsmål
end et svar ?

m.v.h Niels



Mogens Hansen (15-10-2001)
Kommentar
Fra : Mogens Hansen


Dato : 15-10-01 08:56


"Niels" <wuss@hillbilly.dk> wrote in message
news:3BCA01A4.2070301@hillbilly.dk...
>
>
> Det er da vist meget simple programmer, som ikke "læner" sig op af
> platform + compiler... ??? er det ikke? ja det er nærmere et spørgsmål
> end et svar ?
>

Nej, se f.eks.

http://www.cs.wustl.edu/~schmidt/TAO.html

og vurdér om det er simpelt. (Hint: det er det ikke)
Se listen af supportede platforme og compilere!

Der er naturligvis ikke noget galt i at skrive programmer der afhænger af en
bestemt platform eller compiler - specielt hvis man er klar over hvad man
laver, og har vurderet at det passer til ens behov.

Selvom dele af en applikation (f.eks. GUI) er afhængig af en platform og
compiler, betyder det ikke at alle dele af applikationen er det. Ved at
designe en passende lagdeling med hensigtsmæssige afhængigheder, kan man
sagtens sikre at kernen i applikationen er portabel.

Nyttige applikationer lever længere end man forestiller sig.

Venlig hilsen

Mogens Hansen







Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste