[C++] Inlezen datafile lukt niet, hoe aanpakken?

Pagina: 1
Acties:

  • [J.d.I.] DirtyHarry
  • Registratie: December 1999
  • Laatst online: 19-11 10:25
Beste medetweakert
Ik ben bezig met een programmatje te schrijven waarmee ik een datafile kan inlezen, zodat ik op de data een bewerking kan uitvoeren. Ik krijg het alleen niet goed voor elkaar om het datafile goed in te lezen. Waarschijnlijk heb ik ook niet de beste aanpak.


Het datafile heeft de volgende structuur:

de 1e regel is bagger (kolomtitels enzo)
Volgende regels zien er zo uit:
14 kolommen met getallen, gescheiden met tabs en spaties, daarna de (300) meetwaarden, gescheiden met komma's (achter de laatste waarde geen komma). Daarna een tab, en vervolgens weer 300 meetwaarden gescheiden met komma's, eindigend met een newline char. Zoiets ongeveer:

code:
1
2
bagger
19  2006    11  19  0   1   49  441715014   7   14764      -37.1       -51.9    1   1   15,-16,-15,140,15,(enz 300x),172,12    13,16,-19,14,(weer 300x),22,-4,6



Het doel is dat ik deze meetwaarden in twee (integer) arrays (met elk size 300) wil proppen, zodat ik hier bewerkingen op kan uitvoeren (integratieoppervlak berekenen en nog wat van dat soort dingen). Per regel van de datafile moet dit gebeuren totdat het datafile eindigt.

Wat is de beste aanpak om dit te doen? Ik heb geprobeerd met ifstream de file te openen en de eerste 14 kolommen kan ik wel inlezen, maar daarna wordt het lastig. Ik krijg het niet voor elkaar om de waarden in twee arrays te krijgen :'(
Kan iemand mij helpen/adviseren?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:32

Creepy

Tactical Espionage Splatterer

Hoe heb je precies de file ingelezen en hoe heb je geprobeerd de kolommen in variabelen of in een array te stoppen? Een stukje relevante code zou wel helpen :)

[ Voor 16% gewijzigd door Creepy op 07-02-2007 11:11 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 13:12
1. al je meetwaarden inlezen als string (of char array inlezen)
2. Opsplitsen bij de komma
3. Converteren naar een integer

  • [J.d.I.] DirtyHarry
  • Registratie: December 1999
  • Laatst online: 19-11 10:25
Dit is wat ik tot nu toe heb:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ifstream in("crash.txt");
string firstline;
getline(in, firstline);

for(int i=0;i<14;i++){
    float dummy;
    in >> dummy;
    if (i==10) cout << dummy << "\t"; //print out integral on column 11
}

string str1, str2;
in>>str1>>str2;
    
int tracevec1[300];
int tracevec2[300];
    
istringstream iss1(str1);
istringstream iss2(str2);
int a=0, b=0, i=0;

while(i<300){
    iss1>>a;
    tracevec1[i]=a;
    cout<<tracevec1[i]<<endl;
    i++;
}


Alleen als ik nu tracevec1 uitprint dan zie ik 300x de waarde 15. Dus op de een of andere manier blijft hij hangen bij het eerste getal, omdat hij niet over de eerste komma heen kan.. Geen idee hoe ik dat zou moeten doen..

[ Voor 6% gewijzigd door een moderator op 07-02-2007 11:52 . Reden: even de [code=c++]-tag gebruikt dan ziet het er wat toffer uit :) ]


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
stop de meetwaarden met z'n allen (300 stuks) in een std::string die je vervolgens met een istrstream (zie <strstream>) scheidend op de komma inleest.

  • [J.d.I.] DirtyHarry
  • Registratie: December 1999
  • Laatst online: 19-11 10:25
sam.vimes schreef op woensdag 07 februari 2007 @ 11:44:
stop de meetwaarden met z'n allen (300 stuks) in een std::string die je vervolgens met een istrstream (zie <strstream>) scheidend op de komma inleest.
is istrstream wat anders dan istringstream dan? Ik kan op cplusplus.com hier niks over vinden..
Met istringstream lukt het niet. Ik kan wel iets met ignore doen, maar dan moet ik ook het aantal characters ingeven die hij in moet lezen. En mijn datawaarden kunnen bestaan uit 1, 2 of 3 digits, en wellicht met een - teken ervoor.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

sam.vimes schreef op woensdag 07 februari 2007 @ 11:44:
stop de meetwaarden met z'n allen (300 stuks) in een std::string die je vervolgens met een istrstream (zie <strstream>) scheidend op de komma inleest.
ieuw, strstream is deprecated. Gebruik std::isstream uit de header <sstream>. Alleen snap ik niet waarom, je hebt al een stream, waarom zou je dat dan eerst in een andere stream zetten?

[J.d.I.] DirtyHarry: je probleem is dat een komma natuurlijk geen getal is. Ignore() is idd de goede manier, maar waarom is het aantal characters een probleem? Je geeft namelijk ook een delimiter op (de komma natuurlijk), dus je moet gewoon zorgen dat het aantal characters groot genoeg is (INT_MAX)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
std::copy werkt natuurlijk ook, van een istream_iterator naar je array.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoe gaat die istream_iterator dan die delimiters ignoren? (Let op, het gaat 'm om die getallen die gescheiden zijn door komma's)

VC++ 2005 heeft overigens een mooie bug zie ik. Hij kan een int gevolgd door een komma ("1,") niet parsen als int 8)7.
.edit: en blijkbaar ligt dat aan de locale settings. Als ik 'm op Dutch zet dan werkt het wel. Gek genoeg werkt het dan weer niet met de punt. Áls het dan fout zou moeten gaan zou je dat eerder andersom verwachten, maar eerder zou het gewoon niet fout moeten gaan.

[ Voor 34% gewijzigd door .oisyn op 08-02-2007 02:21 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1