|
| indlæs data fra fil til matrix! Fra : Heureka |
Dato : 10-01-05 22:29 |
|
Hej,
Nogen der kan fortælle mig hvordan jeg (nemmest) kan indlæse data fra en fil
til en matrix. Mine data ligger således i filen:
2.0276522e-001 1.5273927e-002 4.1864947e-001 8.3811845e-001
5.0281288e-001
1.9872174e-001 7.4678568e-001 8.4622142e-001 1.9639514e-002
7.0947139e-001
6.0379248e-001 4.4509643e-001 5.2515250e-001 6.8127716e-001
4.2889237e-001
2.7218792e-001 9.3181458e-001 2.0264736e-001 3.7948102e-001
3.0461737e-001
1.9881427e-001 4.6599434e-001 6.7213747e-001 8.3179602e-001
1.8965375e-001
Håber ikke spørgsmålet er for trivielt!
Thomas
| |
Heureka (10-01-2005)
| Kommentar Fra : Heureka |
Dato : 10-01-05 22:32 |
|
Jeg kan se at Outlook reshaper vinduet og laver om på hvorledes mine data er
præsenteret, men i filen ligger de gemt i 5 rækker og 5 søjler!
"Heureka" <stoltzo@hotmail.com> wrote in message
news:41e2f396$1@news.wineasy.se...
> Hej,
>
> Nogen der kan fortælle mig hvordan jeg (nemmest) kan indlæse data fra en
> fil til en matrix. Mine data ligger således i filen:
>
> 2.0276522e-001 1.5273927e-002 4.1864947e-001 8.3811845e-001
> 5.0281288e-001
> 1.9872174e-001 7.4678568e-001 8.4622142e-001 1.9639514e-002
> 7.0947139e-001
> 6.0379248e-001 4.4509643e-001 5.2515250e-001 6.8127716e-001
> 4.2889237e-001
> 2.7218792e-001 9.3181458e-001 2.0264736e-001 3.7948102e-001
> 3.0461737e-001
> 1.9881427e-001 4.6599434e-001 6.7213747e-001 8.3179602e-001
> 1.8965375e-001
>
>
> Håber ikke spørgsmålet er for trivielt!
>
> Thomas
>
| |
Bertel Brander (10-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 10-01-05 22:54 |
|
Heureka wrote:
> Jeg kan se at Outlook reshaper vinduet og laver om på hvorledes mine data er
> præsenteret, men i filen ligger de gemt i 5 rækker og 5 søjler!
>
> "Heureka" <stoltzo@hotmail.com> wrote in message
> news:41e2f396$1@news.wineasy.se...
>
>>Hej,
>>
>>Nogen der kan fortælle mig hvordan jeg (nemmest) kan indlæse data fra en
>>fil til en matrix. Mine data ligger således i filen:
Hvis der er et fast antal double per linie:
#include <fstream>
#include <iostream>
#include <stdio.h>
const int NUM_SAMPLES = 128;
const int NUM_COLUMS_PR_LINE = 5;
int main()
{
double str[NUM_SAMPLES][NUM_COLUMS_PR_LINE];
std::fstream file_op("input.txt", std::ios::in);
int NumSamples = 0;
while(!file_op.eof() && NumSamples < NUM_SAMPLES)
{
for(int i = 0; i < NUM_COLUMS_PR_LINE; i++)
file_op >> str[NumSamples][i];
if(!file_op.eof())
NumSamples++;
}
file_op.close();
for(int indx = 0; indx < NumSamples; indx++)
{
std::cout << "sample no. : " << indx;
for(int j = 0; j < NUM_COLUMS_PR_LINE; j++)
std::cout << " " << str[indx][j];
std::cout << std::endl;
}
std::cout << "Hit enter to exit" << std::endl;
getchar();
return 0;
}
>>
>>Håber ikke spørgsmålet er for trivielt!
Det var tæt på...
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Heureka (10-01-2005)
| Kommentar Fra : Heureka |
Dato : 10-01-05 23:04 |
|
Takker mange gange for den hurtige ekspedition!
Milliard hilsner
Thomas
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e2f98f$0$89051$edfadb0f@dread14.news.tele.dk...
> Heureka wrote:
>> Jeg kan se at Outlook reshaper vinduet og laver om på hvorledes mine data
>> er
>> præsenteret, men i filen ligger de gemt i 5 rækker og 5 søjler!
>>
>> "Heureka" <stoltzo@hotmail.com> wrote in message
>> news:41e2f396$1@news.wineasy.se...
>>
>>>Hej,
>>>
>>>Nogen der kan fortælle mig hvordan jeg (nemmest) kan indlæse data fra en
>>>fil til en matrix. Mine data ligger således i filen:
>
> Hvis der er et fast antal double per linie:
>
> #include <fstream>
> #include <iostream>
> #include <stdio.h>
>
> const int NUM_SAMPLES = 128;
> const int NUM_COLUMS_PR_LINE = 5;
>
> int main()
> {
> double str[NUM_SAMPLES][NUM_COLUMS_PR_LINE];
>
> std::fstream file_op("input.txt", std::ios::in);
>
> int NumSamples = 0;
> while(!file_op.eof() && NumSamples < NUM_SAMPLES)
> {
> for(int i = 0; i < NUM_COLUMS_PR_LINE; i++)
> file_op >> str[NumSamples][i];
> if(!file_op.eof())
> NumSamples++;
> }
>
> file_op.close();
>
> for(int indx = 0; indx < NumSamples; indx++)
> {
> std::cout << "sample no. : " << indx;
> for(int j = 0; j < NUM_COLUMS_PR_LINE; j++)
> std::cout << " " << str[indx][j];
> std::cout << std::endl;
> }
> std::cout << "Hit enter to exit" << std::endl;
> getchar();
>
> return 0;
> }
>
>>>
>>>Håber ikke spørgsmålet er for trivielt!
>
> Det var tæt på...
>
> --
> "We learned more from a three minute record, baby
> than we ever learned in school"
> - Bruce Springsteen
| |
Mogens Hansen (11-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 11-01-05 13:44 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e2f98f$0$89051$edfadb0f@dread14.news.tele.dk...
[8<8<8<]
> #include <stdio.h>
#include <cstdio>
er at foretrække - <stdio.h> er depricated i C++
[8<8<8<]
> while(!file_op.eof() && NumSamples < NUM_SAMPLES)
Programmet er ikke robust over for trivielle fejl i input data - men kunne
simpelt blive det, og giver egentlig indtryk af at indeholde fejlhåndtering.
F.eks. at filen ikke findes eller at den indeholder noget der ikke kan
konverteres til double.
I stedet for file_op.eof() vil jeg derfor anbefale at teste for
fejl-tilstande generelt.
Altså:
while(file_op && ...)
[8<8<8<]
> if(!file_op.eof())
Det samme her - der kan stå noget i filen, der ikke kan konverteres til
double (f.eks. et ord).
[8<8<8<]
> file_op.close();
Det er strengt taget overflødigt, idet filen automatisk lukkes når file_op
går ud af scope.
[8<8<8<]
> return 0;
Streng taget overflødig.
[8<8<8<]
>>>Håber ikke spørgsmålet er for trivielt!
>
> Det var tæt på...
Og så alligevel...
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (11-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 11-01-05 19:46 |
|
Mogens Hansen wrote:
>
>>#include <stdio.h>
>
>
> #include <cstdio>
> er at foretrække - <stdio.h> er depricated i C++
OP har tidligere vist kode der inkluderer, stdafx.h, det kunne
tyde på at han bruge VisualC++, hvis der er version 6.0 er
det er dårlig idé at bruge cstdio
>
>> return 0;
>
>
> Streng taget overflødig.
Visual C++ 6.0 giver en warning hvis ikke den er der.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (11-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 11-01-05 22:23 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e41ee2$0$238$edfadb0f@dread12.news.tele.dk...
> Mogens Hansen wrote:
[8<8<8<]
>> #include <cstdio>
>> er at foretrække - <stdio.h> er depricated i C++
>
> OP har tidligere vist kode der inkluderer, stdafx.h, det kunne
> tyde på at han bruge VisualC++, hvis der er version 6.0 er
> det er dårlig idé at bruge cstdio
Hvis der er behov for en work-around for compiler-fejl, kan man benytte
betinget compilering - så er det også tydeligt for læsere at man er bevidst
om hvorfor man skriver depricated kode.
Det er generelt en dårlig ide at benytte Microsoft Visual C++ V6.0 når der
findes mange bedre alternativer - f.eks. de nyere versioner af Microsoft
Visual C++.
Ikke mindst hvis man, som det tilsynelandende gælder for OP, er forholdvis
ny i anvendelsen af C++ og derfor ikke har behov for at blive bebyrdet med
compiler fejl i relation til opfattelsen af hvad C++ er.
[8<8<8<]
> Visual C++ 6.0 giver en warning hvis ikke den er der.
Endnu en grund til at benytte en mindre fejlbehæftet C++ compiler.
Venlig hilsen
Mogens Hansen
| |
Mogens Hansen (11-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 11-01-05 13:44 |
|
"Heureka" <stoltzo@hotmail.com> wrote in message
news:41e2f396$1@news.wineasy.se...
> Hej,
>
> Nogen der kan fortælle mig hvordan jeg (nemmest) kan indlæse data fra en
> fil til en matrix.
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
int main()
{
using namespace std;
vector<double> samples;
ifstream file("input.txt");
istream_iterator<double> file_begin(file), file_end;
copy(file_begin, file_end, back_inserter(samples));
cout << samples.size() << " samples read" << endl;
cout << "Hit enter to exit" << endl;
cin.get();
}
Bemærk at det er komplet med rudimentær fejlhåndtering og der er ingen
hårdkodede begrænsning på mængden af data.
Hvis du vil gøre det lidt mere struktureret kan hver linie opfattes som en
datastruktur bestående af 5 doubles.
Til det formål er det simplet at benyttes Boost.Tuple ( www.boost.org)
biblioteket (som formodentlig bliver en del af C++ Standard Library):
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_io.hpp>
int main()
{
using namespace std;
using namespace boost;
typedef tuple<double, double, double, double, double> sample;
vector<sample> samples;
ifstream file("input.txt");
file >> tuples::set_open(' ') >> tuples::set_close(' ');
istream_iterator<sample> file_begin(file), file_end;
copy(file_begin, file_end, back_inserter(samples));
cout << samples.size() << " samples read" << endl;
copy(samples.begin(), samples.end(), ostream_iterator<sample>(cout,
"\n"));
cout << "Hit enter to exit" << endl;
cin.get();
}
Venlig hilsen
Mogens Hansen
PS.
Det er så vidt jeg kan se en fejl i Boost.Tuple input stream operator, der
gør at filen der læses skal slutte med et mellemrum eller linie skift.
Konkret mener jeg at
if (!is.good() ) return is;
skal erstattes med
std::basic_istream<CharType, CharTrait>::sentry se(is);
if(!se) return is;
| |
Bertel Brander (11-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 11-01-05 19:47 |
|
Mogens Hansen wrote:
> Til det formål er det simplet at benyttes Boost.Tuple ( www.boost.org)
> biblioteket (som formodentlig bliver en del af C++ Standard Library):
Forhåbentligt varer det nogle hundrede år!
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (11-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 11-01-05 22:24 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e41f32$0$238$edfadb0f@dread12.news.tele.dk...
> Mogens Hansen wrote:
>> Til det formål er det simplet at benyttes Boost.Tuple ( www.boost.org)
>> biblioteket (som formodentlig bliver en del af C++ Standard Library):
>
> Forhåbentligt varer det nogle hundrede år!
Hvorfor håber du det ?
Man har ofte behov for en lille data-struktur for at indikere at data udgør
en sammenhæng.
Til simple behov, som dette eksempel, er det nyttigt ikke at skulle erklære
en hel struktur manuelt med tilhørende simpel funktionalitet (streaming,
sammenligning) eller håndtere del-elementerne eksplicit.
I det konkret syntes jeg at det er nydeligt at der stort set ikke er forskel
om programmet behandler int, float eller tupler.
Og nej, det kommer formodentlig ikke til at vare nogle hundrede år.
Det er, så vidt jeg ved, besluttet at det bliver en del af næste C++
Standard.
Se f.eks.
http://www.open-std.org/jtc1/sc22/wg21/docs/library_technical_report.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1403.pdf
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (11-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 11-01-05 22:35 |
|
Mogens Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:41e41f32$0$238$edfadb0f@dread12.news.tele.dk...
>
>>Mogens Hansen wrote:
>>
>>>Til det formål er det simplet at benyttes Boost.Tuple ( www.boost.org)
>>>biblioteket (som formodentlig bliver en del af C++ Standard Library):
>>
>>Forhåbentligt varer det nogle hundrede år!
>
>
> Hvorfor håber du det ?
>
Fordi boost er en enorm mængde kode der ikke tilføjer noget
afgørende nyt til sproget.
For mig at se burde man indskrænke sig til at ændre nogle
få grundlæggende ting (som f.ex. enum's) og lave en brugbar
stream håndtering.
/b
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Kristian Dupont (12-01-2005)
| Kommentar Fra : Kristian Dupont |
Dato : 12-01-05 17:24 |
|
> Fordi boost er en enorm mængde kode der ikke tilføjer noget
> afgørende nyt til sproget.
boost.tuple != boost
Efter min mening er boost en enorm mængde kode der udgør *milepæle* i c++'s
udvikling. Alene det at det kommer så tæt på en standard som det gør.
shared_ptr lader måske noget tilbage at ønske for nogle, men det ændrer ikke
på at den er bredt accepteret hvilket forøger sandsynligheden for at ens
kode kan arbejde sammen med anden kode.
Jeg er helt enig i at tuple's er nyttige - og en meget naturlig forlængelse
af std::pair, der i virkeligheden virker lovligt snæver når man kender
boost.tuple.
Kristian
| |
Bertel Brander (12-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 12-01-05 20:16 |
|
Kristian Dupont wrote:
>>Fordi boost er en enorm mængde kode der ikke tilføjer noget
>>afgørende nyt til sproget.
>
>
> boost.tuple != boost
Jeg havde ikke læst Mogens mail ordenligt, jeg frygtede at man ville
putte _hele_ boost ind i standard C++, det er heldigvis ikke tilfældet.
>
> Efter min mening er boost en enorm mængde kode der udgør *milepæle* i c++'s
> udvikling.
Jeg har kun prøvet at bruge Boost én gang, som jeg husker det var der
300 MByte source kode i 40.000 filer, hvoraf halvdelen selv efter en
måneds arbejde ikke kunne kompilere.
Jeg forsøgte at inkludere en af deres header-filer, men det betød at
der automatisk blev inkluderet 5.000 andre så det varede en formiddag
at kompilere en enkelt fil. Jeg opgav at finde rundt i deres 30.000
nestede namespaces.
Hvorfor laver man ikke et bibliotek hvor man kan nøjes med at inkludere
det man vil bruge?
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (12-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 12-01-05 21:38 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e5775c$0$200$edfadb0f@dread11.news.tele.dk...
[8<8<8<]
> Jeg har kun prøvet at bruge Boost én gang, som jeg husker det var der
> 300 MByte source kode i 40.000 filer, hvoraf halvdelen selv efter en
> måneds arbejde ikke kunne kompilere.
Hmm...
Det eksempel jeg postede oversatte umiddelbart på 2 compilere - hvoraf den
Borland C++Builder 6 ikke længere kan opfattes som state-of-art med hensyn
til C++ implementering.
En stor del af Boost oversættes og køres succesfuldt regelmæssigt på en lang
række compilere og platforme.
Se f.eks.
http://www.meta-comm.com/engineering/boost-regression/developer/summary.html
for akuel status.
Sådan har det været i årevis.
> Jeg forsøgte at inkludere en af deres header-filer, men det betød at
> der automatisk blev inkluderet 5.000 andre så det varede en formiddag
> at kompilere en enkelt fil. Jeg opgav at finde rundt i deres 30.000
> nestede namespaces.
Ok - overdrivelse fremmer forståelsen.
> Hvorfor laver man ikke et bibliotek hvor man kan nøjes med at inkludere
> det man vil bruge?
Boost bruger Boost - det er vel rimeligt nok.
Bemærkede du at jeg i eksemplet inkluderede 2 header-filer fra Boost ?
Det er ikke ligefrem et udtryk for at een header fil inkluderer meget mere
end hvad der er brug for.
Venlig hilsen
Mogens Hansen
| |
Thorsten Ottosen (13-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 13-01-05 00:03 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e5775c$0$200$edfadb0f@dread11.news.tele.dk...
| Kristian Dupont wrote:
| >>Fordi boost er en enorm mængde kode der ikke tilføjer noget
| >>afgørende nyt til sproget.
| >
| >
| > boost.tuple != boost
|
| Jeg havde ikke læst Mogens mail ordenligt, jeg frygtede at man ville
| putte _hele_ boost ind i standard C++, det er heldigvis ikke tilfældet.
nej, men meget af det vil nok (og deruder vil vi nok også se andet).
her er en rimelig liste af biblioteker, som pt er i boost eller som er
accepteret,
som jeg tror vil komme i det nye standard bibliotek (ud over tr1,
selvfølgelig).
1. boost.range (*)
2. boost.io
3. boost.format (**)
4. boost.string (*)
5. boost.date time
6. boost.filesystem (**)
7. boost.optional
8. boost.variant
(*) betyder at jeg nok vil
skrive forslaget til standard komiteen engang ved lejlighed.
(**) betyder jeg ved folk er ved
at skrive forslagene. Jeg tror også en del andre ting vil komme.
| >
| > Efter min mening er boost en enorm mængde kode der udgør *milepæle* i
c++'s
| > udvikling.
jeg kunne ikke være mere enig.
| Jeg har kun prøvet at bruge Boost én gang, som jeg husker det var der
| 300 MByte source kode i 40.000 filer, hvoraf halvdelen selv efter en
| måneds arbejde ikke kunne kompilere.
hm...hvad kompiler bruger du? Boost er et et de mest
portable bibliotker, jeg kender.
| Hvorfor laver man ikke et bibliotek hvor man kan nøjes med at inkludere
| det man vil bruge?
Der er tit folk, som efterspørger dette. Det er for det første svært
ikke at bruge lidt andet kode fra boost . For det andet burde du måske
bruge precompiled headers. Visual C++ 7.1 er gratis, hurtig og understøtter
PCH og compilere 99% af boost.
-Thorsten
--
Thorsten Ottosen
----------------------------
Dezide Aps -- Intelligent Customer Support:
www.dezide.com
Aalborg University --- Decision Support Systems:
http://www.cs.aau.dk/index2.php?content=Research/bss
C++ Boost:
www.boost.org
C++ Standard:
http://www.open-std.org/JTC1/SC22/WG21/
| |
Bertel Brander (13-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 13-01-05 00:38 |
|
Thorsten Ottosen wrote:
> |
> | Jeg havde ikke læst Mogens mail ordenligt, jeg frygtede at man ville
> | putte _hele_ boost ind i standard C++, det er heldigvis ikke tilfældet.
>
> nej, men meget af det vil nok (og deruder vil vi nok også se andet).
>
Efter min ringe mening skal man være meget varsom med hvad
man putter i standarden. Hvis man stiller for store krav
vil for mange kompiler fabrikanter ikke understøtte det
hele, og standarden vil ikke være en standard mere.
Det er naturligvis en balance, men man bør (efter min
mening) ikke putte ting i standarden som hovedparten af
brugere ikke vil få brug for.
>
> hm...hvad kompiler bruger du? Boost er et et de mest
> portable bibliotker, jeg kender.
Jeg brugte på det tidspunkt VisualC++ 6.0. Jeg ledte efter et
reg. exp. lib, men opgav, fandt en 20 år gammel kode som jeg
"justerede" og puttede ind i en class. Det var lettere end
at finde ud af hvordan man brugte boost.
>
> | Hvorfor laver man ikke et bibliotek hvor man kan nøjes med at inkludere
> | det man vil bruge?
>
> Der er tit folk, som efterspørger dette. Det er for det første svært
> ikke at bruge lidt andet kode fra boost . For det andet burde du måske
> bruge precompiled headers. Visual C++ 7.1 er gratis, hurtig og understøtter
> PCH og compilere 99% af boost.
>
Det er ikke altid at man selv kan vælge kompiler.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Thorsten Ottosen (13-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 13-01-05 09:15 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e5b4db$0$33622$edfadb0f@dread16.news.tele.dk...
| Thorsten Ottosen wrote:
| > |
| > | Jeg havde ikke læst Mogens mail ordenligt, jeg frygtede at man ville
| > | putte _hele_ boost ind i standard C++, det er heldigvis ikke tilfældet.
| >
| > nej, men meget af det vil nok (og deruder vil vi nok også se andet).
| >
|
| Efter min ringe mening skal man være meget varsom med hvad
| man putter i standarden. Hvis man stiller for store krav
| vil for mange kompiler fabrikanter ikke understøtte det
| hele, og standarden vil ikke være en standard mere.
tja, der vil formentlig være flere stand-alone implementationer af standard
biblioteket, som vil virke med mange kompilere. Dinkumware er et eksempel.
Vi skal også tænke på at der går 10 år mellem hver standard, så det er lang
tid at vente
på noget vi ligeså godt kunne have tilføjet nu.
| Det er naturligvis en balance, men man bør (efter min
| mening) ikke putte ting i standarden som hovedparten af
| brugere ikke vil få brug for.
Det er en udbredt holdning i C++ komiteen at vi bør gøre mere
for at gøre det nemt at være application programmer. Derfor vil vi se
en kraftig tilføjelse af nye biblioteker.
-Thorsten
| |
Thorsten Ottosen (12-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 12-01-05 22:59 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41e4468a$0$194$edfadb0f@dread11.news.tele.dk...
| Mogens Hansen wrote:
| > "Bertel Brander" <bertel@post4.tele.dk> wrote in message
| > news:41e41f32$0$238$edfadb0f@dread12.news.tele.dk...
| >
| >>Mogens Hansen wrote:
| >>
| >>>Til det formål er det simplet at benyttes Boost.Tuple ( www.boost.org)
| >>>biblioteket (som formodentlig bliver en del af C++ Standard Library):
| >>
| >>Forhåbentligt varer det nogle hundrede år!
| >
| >
| > Hvorfor håber du det ?
| >
|
| Fordi boost er en enorm mængde kode der ikke tilføjer noget
| afgørende nyt til sproget.
tja, det giver vel sig selv at et bibliotek ikke tilføjer noget
nyt til sproget (når vi ser bort fra domain specific languages, som
jo udvider sproget).
| For mig at se burde man indskrænke sig til at ændre nogle
| få grundlæggende ting (som f.ex. enum's) og lave en brugbar
| stream håndtering.
Jo, der vil komme en ny enum type og << vil nok virke for
alle typer i standard biblioteket.
Men de er nok nogle af de små ændringer.
-Thorsten
--
Thorsten Ottosen
----------------------------
Dezide Aps -- Intelligent Customer Support:
www.dezide.com
Aalborg University --- Decision Support Systems:
http://www.cs.aau.dk/index2.php?content=Research/bss
C++ Boost:
www.boost.org
C++ Standard:
http://www.open-std.org/JTC1/SC22/WG21/
| |
Heureka (16-01-2005)
| Kommentar Fra : Heureka |
Dato : 16-01-05 17:41 |
|
Hej Igen,
Jeg har forsøgt mig med noget af koden som i har sendt, men det lykkes ikke
rigtig for mig at hente de rigtige data ud af min matrix. Koden som jeg har
prøvet ser således ud:
const int NUM_ROWS = 15;
const int NUM_COLUMNS = 2;
int _tmain(int argc, _TCHAR* argv[])
{
double str[NUM_ROWS][NUM_COLUMNS];
std::fstream file_op("coefs.dat", std::ios::in);
int NumCoefs = 0;
while(!file_op.eof() && NumCoefs < NUM_ROWS)
{
for(int i = 0; i < NUM_COLUMNS; i++)
file_op >> str[NumCoefs][i];
if(!file_op.eof())
NumCoefs++;
}
file_op.close();
for(int indx = 0; indx < NumCoefs; indx++)
{
std::cout << "sample no. " << indx << " : [";
for(int j = 0; j < NUM_COLUMNS; j++)
printf(" %2.4f, ",str[indx][j]);
std::cout << "]"<<std::endl;
}
std::cout << "Hit enter to exit" << std::endl;
getchar();
return 0;
}
Coefs.data ser således ud:
-1.8250960e+000 8.3392686e-001
-1.9184108e+000 9.2769313e-001
-1.6620100e+000 6.9457066e-001
-1.8252978e+000 8.6105748e-001
-1.5091458e+000 5.7705316e-001
-1.7225298e+000 8.0003884e-001
-1.3651172e+000 4.7759225e-001
-1.6117271e+000 7.4452084e-001
-1.2287186e+000 3.9322938e-001
-1.4942807e+000 6.9434704e-001
-1.0988973e+000 3.2163251e-001
-1.3713747e+000 6.4933827e-001
-9.7472922e-001 2.6095218e-001
-1.2440103e+000 6.0930591e-001
-8.5539793e-001 2.0971536e-001
-1.1130299e+000 5.7406192e-001
-6.2840993e-001 1.3110800e-001
-8.4292914e-001 5.1723237e-001
-4.1291870e-001 7.9008574e-002
-5.6545007e-001 4.7759225e-001
-2.0469809e-001 4.9247784e-002
-2.8369960e-001 4.5419615e-001
1.2490009e-016 3.9566130e-002
-4.8572257e-016 4.4646269e-001
4.1291870e-001 7.9008574e-002
5.6545007e-001 4.7759225e-001
8.5539793e-001 2.0971536e-001
1.1130299e+000 5.7406192e-001
1.3651172e+000 4.7759225e-001
1.6117271e+000 7.4452084e-001
Men jeg får promptet værdier ud som ligger omkring 10^60 - nogen idéer?
Vh.
Thomas
| |
Bertel Brander (16-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 16-01-05 20:05 |
|
Heureka wrote:
> std::fstream file_op("coefs.dat", std::ios::in);
Prøv at checke om filen kunne åbnes:
if(!file_op)
{
std::cerr << "Failed to open data file" << std::endl;
return 1;
}
> int NumCoefs = 0;
> while(!file_op.eof() && NumCoefs < NUM_ROWS)
> {
> for(int i = 0; i < NUM_COLUMNS; i++)
> file_op >> str[NumCoefs][i];
Prøv at checke om der kunne læses og konverteres:
if(!(file_op >> str[NumCoefs][i]))
{
std::cerr << "Failed to convert" << std::endl;
return 2;
}
> Men jeg får promptet værdier ud som ligger omkring 10^60 - nogen idéer?
>
Ikke udover det ovenfor anførte, her virker det ok.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (16-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 16-01-05 22:14 |
|
"Heureka" <stoltzo@hotmail.com> skrev i en meddelelse
news:41ea991b$1@news.wineasy.se...
[8<8<8<]
> while(!file_op.eof() && NumCoefs < NUM_ROWS)
Har du prøvet at skrive
while(file_op && ...
i stedet for
while(!file_op.eof() && ...
Der er, som jeg tidligere har skrevet i denne tråd, andre ting end
end-of-file, der kan få læsningen til at fejle.
Eller endnu bedre, test også om læsning er gået godt inden resulatet af
læsningen benyttes - det gør det hele meget simplere uden ekstra tests:
while( file_op >> str[num_coefs][0] >> str[num_coefs][1] &&
num_coefs < NUM_ROWS) {
++num_coefs;
}
[8<8<8<]
> std::cout << "sample no. " << indx << " : [";
> for(int j = 0; j < NUM_COLUMNS; j++)
> printf(" %2.4f, ",str[indx][j]);
> std::cout << "]"<<std::endl;
Hvorfor blander du C++ streams og printf sammen ?
Det forekommer mig forvirrende.
[8<8<8<]
> Men jeg får promptet værdier ud som ligger omkring 10^60 - nogen idéer?
Det lyder som om der slet ikke bliver læst noget. Dine værdier er derfor
ikke initialiseret, og dit program har undefined behaviour.
Som jeg tidligere har skrevet i denne tråd er programmet ikke robust.
Måske skyldes det er læsningen ikke forstår formatet rigtigt.
Prøv at sætte floating point formateringen til scientific:
file_op >> scientific;
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (16-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 16-01-05 22:49 |
|
Mogens Hansen wrote:
>> std::cout << "sample no. " << indx << " : [";
>> for(int j = 0; j < NUM_COLUMNS; j++)
>> printf(" %2.4f, ",str[indx][j]);
>> std::cout << "]"<<std::endl;
>
>
> Hvorfor blander du C++ streams og printf sammen ?
Det kunne være fordi OP ikke ved hvordan man opnår samme
effekt som %2.4f med en C++ stream, jeg ved det heller ikke,
så måske kunne du, eller en anden, forklare hvordan man gør
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Bertel Lund Hansen (16-01-2005)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 16-01-05 23:52 |
|
Bertel Brander skrev:
>Det kunne være fordi OP ikke ved hvordan man opnår samme
>effekt som %2.4f med en C++ stream, jeg ved det heller ikke,
>så måske kunne du, eller en anden, forklare hvordan man gør
De to linjer gør præcis det samme.
setw() sætter det samlede antal tegn som næste udskrift optager.
Den skal sættes hver eneste gang.
#include <iostream>
#include <iomanip>
std::cout << setiosflags(std::ios::fixed) << std::setprecision(4) << std::setw(7) << 3.141592654 << std::endl;
std::cout << std::fixed << std::setprecision(4) << std::setw(7) << 3.141592654 << std::endl;
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Bertel Brander (17-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 17-01-05 00:23 |
|
Bertel Lund Hansen wrote:
> Bertel Brander skrev:
>
>
>>Det kunne være fordi OP ikke ved hvordan man opnår samme
>>effekt som %2.4f med en C++ stream, jeg ved det heller ikke,
>>så måske kunne du, eller en anden, forklare hvordan man gør
>
>
> De to linjer gør præcis det samme.
> setw() sætter det samlede antal tegn som næste udskrift optager.
> Den skal sættes hver eneste gang.
>
> #include <iostream>
> #include <iomanip>
>
> std::cout << setiosflags(std::ios::fixed) << std::setprecision(4) << std::setw(7) << 3.141592654 << std::endl;
>
> std::cout << std::fixed << std::setprecision(4) << std::setw(7) << 3.141592654 << std::endl;
>
Hvilket netop ikke gør det samme som printf("%2.4f", 3.141592654);
Stream metoden udskriver et mellemrum inden det første ciffer, det
gør printf ikke.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Bertel Lund Hansen (17-01-2005)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 17-01-05 00:51 |
|
Bertel Brander skrev:
>> De to linjer gør præcis det samme.
>> setw() sætter det samlede antal tegn som næste udskrift optager.
>Hvilket netop ikke gør det samme som printf("%2.4f", 3.141592654);
2-tallet angiver det samlede antal tegn. Det svarer altså til setw(2).
I sådanne tilfælde skrives der 6 tegn, nemlig alle cifre foran kommaet,
kommaet samt det specificerede antal decimaler.
Hvis det samlede antal er større end det tilgængelige antal tegn,
dukker mellemrummene op.
Du skal altså sammenligne:
printf("%2.4f\n", 3.141592654);
med
std::cout << std::fixed << std::setprecision(4) << std::setw(2) << 3.141592654 << std::endl;
eller
printf("%7.4f\n", 3.141592654);
med
std::cout << std::fixed << std::setprecision(4) << std::setw(7) << 3.141592654 << std::endl;
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
|
|