/ 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
konvertere punktum til komma i fil - impor~
Fra : Martin Jørgensen


Dato : 05-02-06 07:06

Hej,

Jeg er ved at lære c og c++ programmering og har gemt nogle data i en
tekst-fil. Findes der ikke en ufattelig nem måde til automatisk at
konvertere "." til "," på?

Måden som tallene bliver gemt på er:

for(i=1; i<16; i++) {
   fprintf(OutFile1, "%3i", i); // print nodal point number i
   for(step=1; step<=maxstep; step++)
      fprintf(OutFile1, "\t%6.2f", savedtemp[i][step]);
   fprintf(OutFile1, "\n"); // make room for the next data set
   }

Det er altså nogen temperaturer og jeg vil gerne plotte data i Excel,
som ikke opfatter "." som et komma når jeg kører med dansk
sprog-indstilling. Jeg ved godt at man kan skifte sprog frem og tilbage,
men så vil jeg hellere have en løsning der enten gemmer dataene med
komma, eller som bagefter kan konvertere alle punktummer til kommaer.

Iøvrigt: Tillægsspørgsmål - jeg bruger MS visual studio og vha.
debuggeren kan jeg se at den nogle gange opfører sig underligt. Når jeg
lægger 0,005 til "tiden" vha. "time += dt" så får jeg nogle ret
mærkelige ting på de sidste cifre:

      [0]   0.00000000000000000   double
      [1]   0.0050000000000000001   double
      [2]   0.010000000000000000   double
      [3]   0.014999999999999999   double
      [4]   0.020000000000000000   double
      [5]   0.025000000000000001   double
      [6]   0.030000000000000002   double
      [7]   0.035000000000000003   double
      [8]   0.040000000000000001   double
      [9]   0.044999999999999998   double
      [10]   0.049999999999999996   double
      [11]   0.054999999999999993   double
      [12]   0.059999999999999991   double
      [13]   0.064999999999999988   double
      [14]   0.069999999999999993   double
      [15]   0.074999999999999997   double
      [16]   0.080000000000000002   double
      [17]   0.085000000000000006   double
      [18]   0.090000000000000011   double


hvad skyldes det?

På forhånd tak,


Med venlig hilsen / Best regards
Martin Jørgensen

--
---------------------------------------------------------------------------
Home of Martin Jørgensen - http://www.martinjoergensen.dk

 
 
Mogens Hansen (05-02-2006)
Kommentar
Fra : Mogens Hansen


Dato : 05-02-06 17:45


"Martin Jørgensen" <unoder.spam@spam.jay.net> wrote in message
news:h6hgb3-lu5.ln1@news.tdc.dk...

[8<8<8<]
> Jeg ved godt at man kan skifte sprog frem og tilbage, men så vil jeg
> hellere have en løsning der enten gemmer dataene med komma, eller som
> bagefter kan konvertere alle punktummer til kommaer.

Du kan styre det med locale funktionalitet.
I C++ gør man det ved:
#include <fstream>
#include <locale>

int main()
{
using namespace std;

ofstream file("fnyt.txt");
file.imbue(locale("Danish")); // Locale name is platform specific

unsigned step = 2;
double temp = 20.4;

file << step << '\t' << temp << endl;
}

>
> Iøvrigt: Tillægsspørgsmål - jeg bruger MS visual studio og vha. debuggeren
> kan jeg se at den nogle gange opfører sig underligt. Når jeg lægger 0,005
> til "tiden" vha. "time += dt" så får jeg nogle ret mærkelige ting på de
> sidste cifre:

Det ser ud som om "time" er af typen "double".
Det er en floating point type med endelig opløsning.
Tallet 0,005 kan (tilsyneladende) ikke repræsenteres fuldstændigt præcist.

Du skal måske skrive værdierne ud med specificeret precision, så der
foretages passende afrunding:
#include <fstream>
#include <locale>
#include <iomanip>

int main()
{
using namespace std;

ofstream file("fnyt.txt");
file.imbue(locale("Danish")); // Locale name is platform specific

unsigned step = 2;
double temp = 20.4;

file << step << '\t' << fixed << setprecision(2) << temp << endl;
}

Hvis man vil vide mere om den slags i C++ er den absolut bedste og mest
dækkende bog
Standard C++ IOStreams and Locales
Angelika Langer and Klaus Kreft
ISBN 0-201-18395-1

Venlig hilsen

Mogens Hansen



Martin Jørgensen (06-02-2006)
Kommentar
Fra : Martin Jørgensen


Dato : 06-02-06 00:46

Mogens Hansen wrote:
> "Martin Jørgensen" <unoder.spam@spam.jay.net> wrote in message
> news:h6hgb3-lu5.ln1@news.tdc.dk...
-snip-

> Du kan styre det med locale funktionalitet.
> I C++ gør man det ved:
> #include <fstream>
> #include <locale>
>
> int main()
> {
> using namespace std;
>
> ofstream file("fnyt.txt");
> file.imbue(locale("Danish")); // Locale name is platform specific
>
> unsigned step = 2;
> double temp = 20.4;
>
> file << step << '\t' << temp << endl;
> }

Ok, mange tak. Men hvad gør man i C så? Fordi mit program er egentligt
et C-program og jeg forsøgte at skrive #include <locale> men fik en
masse compiler-vrøvl med MS visual studio... Derudover kompilerer jeg
også lidt med cc og g++ på min macintosh, men det ærgrer mig lidt at man
ikke altid kan skifte frem og tilbage imellem de to compilere.

>>Iøvrigt: Tillægsspørgsmål - jeg bruger MS visual studio og vha. debuggeren
>>kan jeg se at den nogle gange opfører sig underligt. Når jeg lægger 0,005
>>til "tiden" vha. "time += dt" så får jeg nogle ret mærkelige ting på de
>>sidste cifre:
>
>
> Det ser ud som om "time" er af typen "double".

Jep, det er den.

> Det er en floating point type med endelig opløsning.
> Tallet 0,005 kan (tilsyneladende) ikke repræsenteres fuldstændigt præcist.

Hvorfor egentligt ikke?

> Du skal måske skrive værdierne ud med specificeret precision, så der
> foretages passende afrunding:
> #include <fstream>
> #include <locale>
> #include <iomanip>
>
> int main()
> {
> using namespace std;
>
> ofstream file("fnyt.txt");
> file.imbue(locale("Danish")); // Locale name is platform specific
>
> unsigned step = 2;
> double temp = 20.4;
>
> file << step << '\t' << fixed << setprecision(2) << temp << endl;
> }
>
> Hvis man vil vide mere om den slags i C++ er den absolut bedste og mest
> dækkende bog
> Standard C++ IOStreams and Locales
> Angelika Langer and Klaus Kreft
> ISBN 0-201-18395-1

Ok. Jeg kigger lidt på det, men i første omgang prøver jeg at
programmere lidt i C.


Med venlig hilsen / Best regards
Martin Jørgensen

--
---------------------------------------------------------------------------
Home of Martin Jørgensen - http://www.martinjoergensen.dk

Mogens Hansen (06-02-2006)
Kommentar
Fra : Mogens Hansen


Dato : 06-02-06 19:58


"Martin Jørgensen" <unoder.spam@spam.jay.net> wrote in message
news:cbfib3-su6.ln1@news.tdc.dk...

[8<8<8<]
> Derudover kompilerer jeg også lidt med cc og g++ på min macintosh, men det
> ærgrer mig lidt at man ikke altid kan skifte frem og tilbage imellem de to
> compilere.

I den udstrækning man benytter ISO C eller ISO C++ og biblioteker er findes
på begge platforme skulle det kunne lade sig gøre.

[8<8<8<]
>> Det er en floating point type med endelig opløsning.
>> Tallet 0,005 kan (tilsyneladende) ikke repræsenteres fuldstændigt
>> præcist.
>
> Hvorfor egentligt ikke?

Fordi typen har en endelig opløsning.
Du kan sikkert Google efter IEEE floating point representation og finde de
nærmere detaljer.


Venlig hilsen

Mogens Hansen



Martin Jørgensen (06-02-2006)
Kommentar
Fra : Martin Jørgensen


Dato : 06-02-06 23:31

Mogens Hansen wrote:
> "Martin Jørgensen" <unoder.spam@spam.jay.net> wrote in message
> news:cbfib3-su6.ln1@news.tdc.dk...
>
> [8<8<8<]
>
>>Derudover kompilerer jeg også lidt med cc og g++ på min macintosh, men det
>>ærgrer mig lidt at man ikke altid kan skifte frem og tilbage imellem de to
>>compilere.
>
>
> I den udstrækning man benytter ISO C eller ISO C++ og biblioteker er findes
> på begge platforme skulle det kunne lade sig gøre.

Ok, jeg må prøve at google lidt...

>>>Det er en floating point type med endelig opløsning.
>>>Tallet 0,005 kan (tilsyneladende) ikke repræsenteres fuldstændigt
>>>præcist.
>>
>>Hvorfor egentligt ikke?
>
>
> Fordi typen har en endelig opløsning.

Ikke forstået.

> Du kan sikkert Google efter IEEE floating point representation og finde de
> nærmere detaljer.

Det prøver jeg. Tak for svarene.


Med venlig hilsen / Best regards
Martin Jørgensen

--
---------------------------------------------------------------------------
Home of Martin Jørgensen - http://www.martinjoergensen.dk

Mogens Hansen (07-02-2006)
Kommentar
Fra : Mogens Hansen


Dato : 07-02-06 06:38


"Martin Jørgensen" <unoder.spam@spam.jay.net> wrote in message
news:k9vkb3-i97.ln1@news.tdc.dk...

[8<8<8<]
>> Fordi typen har en endelig opløsning.
>
> Ikke forstået.

En floating point type kan ikke repræsentere _alle_ decimaltal _præcist_.
Nogle bestemte værdier kan repræsenteres præcist - resten bliver afrundet,
hvilket naturligvis giver regnefejl. For at styre præcisionen har man
forskellige floating point typer: float, double, long double.

I "gamle dage" var det væsentligt dyrere at regne med større præcision - det
er ikke idag på almindelig PC'er hvor 80 bit floating point operationer er
direkte og effektivt implemeteret i hardware.

Se f.eks.
http://en.wikipedia.org/wiki/IEEE_floating-point_standard
http://stevehollasch.com/cgindex/coding/ieeefloat.html

Venlig hilsen

Mogens Hansen



Martin Jørgensen (09-02-2006)
Kommentar
Fra : Martin Jørgensen


Dato : 09-02-06 23:27

Mogens Hansen wrote:
> "Martin Jørgensen" <unoder.spam@spam.jay.net> wrote in message
> news:k9vkb3-i97.ln1@news.tdc.dk...
-snip-

> Se f.eks.
> http://en.wikipedia.org/wiki/IEEE_floating-point_standard
> http://stevehollasch.com/cgindex/coding/ieeefloat.html

Takker for den uddybende forklaring... Må hellere komme i gang med at
programmere lidt mere...


Med venlig hilsen / Best regards
Martin Jørgensen

--
---------------------------------------------------------------------------
Home of Martin Jørgensen - http://www.martinjoergensen.dk

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste