Gå til innhold

hente ut enkelt datafelt fra tekstfil


Anbefalte innlegg

Har en tekstfil med innhold som følgende :

 

ola:23:2

hans:24:1

trond:23:1

 

osv.. informasjonen står for :

navn:medlemsnr:antall år

 

Skal ha en funksjon som skal sjekke om et medlemmsnummer forekommer flere ganger, men klarer bare å hente ut hele linjen og ikke enkelt-deler av linjen, f.eks 23 på ola:23:2. Noen som kan hjelpe meg ?

Lenke til kommentar
Videoannonse
Annonse

Hvorfor ikke lagre tekstfilene med whitespace (mellomrom, newline eller tab) mellom hvert element?

 

#include <iostream>
#include <sstream>
#include <string>

using namespace std;


int main()
{
// `ss' representerer fila du leser fra.
stringstream ss("ola 23 2\n"
       	"hans 24 1\n"
       	"trond 23 1");
string navn;
unsigned int medlemsnr;
unsigned int aar;

ss >> navn;
ss >> medlemsnr;
ss >> aar;

cout << "Navn: " << navn << endl;
cout << "Medlemsnr.: " << medlemsnr << endl;
cout << "Antall år: " << aar << endl;

ss >> navn;
ss >> medlemsnr;
ss >> aar;

cout << "Navn: " << navn << endl;
cout << "Medlemsnr.: " << medlemsnr << endl;
cout << "Antall år: " << aar << endl;	

return(0);
} // main

 

(Det er forresten ikke umulig å bruke andre ting enn whitespace som separator hvis du vil det.)

Lenke til kommentar

Fullt mulig å bruke annet en whitespace som separator..

 

I C har jeg brukt strtok() for slikt, og vet det er ett eller annet liknende i c++ for å ta ut tokens. Har bare ikke brukt det på lenge...

 

Men strtok skal jo fungere i c++ også, bare vær forsiktig med bruken

Lenke til kommentar

Paster et ex. som tar i bruk boost der : og \n er brukt som separatorer:

 

#include <iostream>
#include <sstream>
#include <string>
#include <boost/tokenizer.hpp>

using namespace std;
using namespace boost;


int main()
{
boost::char_separator<char> sep(":\n");
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
string line;

// `ss' representerer fila du leser fra.
stringstream ss("ola:12:21\n"
       	"hans:24:1\n"
       	"trond:23:1");

ss >> line;
tokenizer tok(line, sep);
for(tokenizer::iterator i = tok.begin(); i != tok.end(); i++)
 cout << *i << endl;

cout << endl;

ss >> line;
tok.assign(line);
for(tokenizer::iterator i = tok.begin(); i != tok.end(); i++)
 cout << *i << endl;

cout << endl;

ss >> line;
tok.assign(line);
for(tokenizer::iterator i = tok.begin(); i != tok.end(); i++)
 cout << *i << endl;

return(0);
} // main

 

Som Duronator nevnte, så er strtok (fra C) ikke helt stø; boost::tokenizer er bedre.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...