Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

jonhhy

Getline de stringstream para uma string

Mensagens Recomendadas

jonhhy    0
jonhhy

Boa tarde,

tenho um problema, que é :

estou a ler um ficheiro de texto é assim:

1 ; Rui Pereira ; 234.67

2 ; Maria de Lurdes ; 123.54

5 ; Joana Beires ; 1231.00

6 ; Manuela Moura ; 1236.80

eu usei dois ciclos:

um que faz:

while (getline(cli, line,'\n'))
{
cout << "line cliA: "<< line << endl; // the content of 1º statment (until first '\n', 1º line of client  is showed
ss.str(line);
string s2 = ss.str();
cout << "cliD: " << s2 << endl;

separa o ficheiro por linas e um outro ciclo que separa por ;

este justifica-se porque no final da linha ele não encontra o ;

o meu problema é que no 2º getline ele so le da 1a vez , why

o getline retorna falso quando ??

for  (counter = 0;getline(ss, line, ';'); counter ++) // or a condition !trasactions.eof()
{
trimSpaces(line);
cout << "line cliB: " << line << '\t' << endl;//-" << line; << "-" << endl;
switch (counter)
{
case 1: save idclient
client.id = stoi(line) ;
if (client.id > clientID)
clientID = client.id;
ss.ignore(1, ';');
break;
case 2: // save name of client
{
client.name = line;
counter++;
ss.ignore(1, ';');
break;
}
case 3: // save money spend by client
{
ss >> client.moneySpent;
counter = 1;
clients.push_back(client); // put the info, save in struct as element of the vector
ss.clear();
cout << "Tamanho = " << clients.size() << endl;
}
}
}
}
}
else
cerr << "error to open clients file" << endl; // with this output fuction,it can show the message with red colour
}

Grato pela vossa ajuda, qq coisa digam

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo    1151
HappyHippyHippo

existe alguma imposição na realização do código em C++ ? é que em C isso é feito de uma maneira muito simples ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jonhhy    0
jonhhy

Podemos utilizar ambas as linguagens até :) , entretanto arranjei esta solução que me desenrasca:

void readClient(Client &client, ifstream &cli, vector <Client> &clients, int &clientID)
{

if (cli.is_open())
{
string line;
int counter = 1;

/*getline(cli, line, '\0');
cout << "FileCli:\n" << line << endl; erase of file..*/
for (int counter = 1; getline(cli, line, ';'); counter++)
{
stringstream ss(line); // There ss have value.. "" see

//trimSpaces(line);


switch (counter)
{
case 1: // save id of client
 ss >> client.id;
 if (client.id >clientID); //faço this mean that idMax is actualized cout << ss;
 clientID = client.id;

 break;
case 2: // save name of client
{
 trimSpaces(line);
 client.name = line;
 counter++;
 //string s = ss.str();
 ss.ignore(1, ';');
}
case 3: // save money spend by client
{
 getline(cli, line, '\n');
 float money = stof(line);
 client.moneySpent = money;
 counter = 0;
 clients.push_back(client); // put the info, save in struct as element of the vector
 ss.clear();
 cout << "Tamanho = " << clients.size() << endl;
 break;
 //cin << cli.
}
//case 3: ss >>
}
}

}
else
cerr << "error to open clients file" << endl; // with this output fuction,it can show the message with red colour
}

esta mais simples.

(aparte: como no code podemos por às cores, indicando a linguagem que estamos a trabalhar?)

Editado por jonhhy

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo    1151
HappyHippyHippo

#define BUFFER_SIZE_256

std::vector<Client> readClient(std::ifstream& stream, int* maxID)
{
   vector<Client> list;

   char buffer[bUFFER_SIZE];
   char name[bUFFER_SIZE];

   *maxID = -1;
   while (getline(stream, buffer))
   {
       Client client;
       if (sscanf(buffer, "%d;[^;];%f", client.id, name, client.moneySpend) != 3)
       {
           std::cout << "Error parsing line : " << buffer << std::endl;
       }
       else
       {
           *maxID = std::max(*maxID, client.id);
           client.name = name;
           list.push_back(client);
       }
   }

   return list;
}

----------------------------

a maneira de colorir o código respentando a linguagem que pretendemos é adicionado a flag da linguagem à tag [ code], desta maneira : [ code=cpp]

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.