[C++] Leitura de ficheiro

JomarC

Power Member
Ora boas boas srs. Eng.

Bem tenho um trabalho em C++ que tenho que ler Objectos (que tão no ficheiro para uns vectores).

O ficheiro e mais ao menos isto:

Carro
carro1(marca, pneu), Carro2(marca, pneu)....CarroN(marca, pneu)

Mota
mota1(marca, cc), Mota2(marca, cc)....MotaN(marca, cc)

...........................................................................................


Por aquilo que andei a pesquisar na net a leitura de ficheiro e qualquer coisa como isto:

Código:
#include <fstream>
#include <string>

//...

string linha;
    ifstream ficheiro;
    ficheiro.open("Login.txt");

    if (ficheiro.is_open())
    {
        while (! ficheiro.eof())
        {
            getline(ficheiro, linha);


         //....
        }
        ficheiro.close(); //fecha o ficheiro
    }
}

A minha duvida ta em como é que eu vou ler os objectos para os vectores..?

E que tenho que ler motas para 1 e carros para outro.

Se alguem ajuda-se eu agradecia e que já andei aqui com ciclos for etc...e nada. Os outros metodos ja tao todos feitos só me falta mesmo ler os obejctos para os vectores.

Porque supondo que eu crio os objectos no main, da tudo na boa, o problema e mesmo ler de ficheiro.

PS: Noob no C++ :D

Cumps
 
Aí o que estas a fazer é ler uma linha. Como já tens isso feito é relativamente simples, basta dividires essa linha no que precisas. Podes criar substrings e tens o teu problema resolvido.

Exemplo: crias uma substring até à primeira virgula, e isso corresponde à informação do carro1. Depois é só dividir essa string de forma a que tenhas os dados necessários para chamar o construtor da classe e criar um objecto.

Por exemplo, no 1º caso tens: carro1(BMW, XPTO).

Imaginando que o construtor é qualquer coisa tipo Carro(marca, pneu) divides essa substring de forma a obteres 2 substrings:

- string marca = "BMW"
- string pneu = "XPTO"

Depois é só chamar o construtor Carro(marca, pneu).

http://www.cppreference.com/wiki/string/start (basicamente vais precisar do .size() e do .substr(argumento1, argumento2, ....)
 
Código:
string substr ( size_t pos = 0, size_t n = npos ) const;

Mas como é que faço substring até a virgula?

Pelo que eu percebi a maneira que da e contando as posições..
 
Última edição pelo moderador:
Exactamente. Para encontrares a posição da virgula podes usar o find.

Código:
string::size_t virgula = linha.find(","); //encontra a posição da virgula
string carro = linha.substr(0, virgula); //faz uma substring desde linha[0] até linha[virgula]
Experimenta assim. Julgo que funciona.
 
É natural que tenhas alguma dificuldade, a análise de input é um problema bastante complexo.

Não percebi bem o formato do ficheiro.

É preciso decidir se os fins de linha têm ou não significado. Se aquilo que está em duas linhas também podia estar numa, então desaconselho-te o getline. Aliás, aí aconselho-te a usar o getline mas usando a vírgula como delimitador (ficheiro.getline(..., ..., ',')), assim, em vez de leres linha a linha, estás a ler virgula a vírgula.

Respondendo especificamente à tua última questão, para encontrares a primeira vírgula na string para depois fazeres o substr, podes utilizar o find_first_of. Tipo:

Código:
  ...
  string::size_type virgula1 = str.find_first_of(',');
  string::size_type virgula2 = str.find_first_of(',', virgula1);
  ...
 
Não precisas. Se fizeres um getline ele guarda-te a linha numa string, em que a linha vai até ao ENTER. Depois já é uma nova linha.
 
Imagina que tens uma classe XPTO com o contrutor XPTO(string st1, string st2);

Para invocares o construtor basta fazeres XPTO objecto1(string st1, string st2); . Feito isto acabaste de criar um objecto com o nome "objecto1" do tipo XPTO. Para adicionares ao vector tens que ter um vector definido assim:

vector<XPTO> myvector;

E para adicionar:

myvector.push_back(objecto1);

Mais info sobre vectores: http://www.cplusplus.com/reference/stl/vector/


Btw, não te esqueças de fazer o include do ficheiro onde tens a classe definida.
 
Ja consegui guardar os atributos nas strings.

Agora como e que chamo o construtor e guardo nos vectores?

Boas,
No exercicio pede para usares uma classe para gerir os objectos "carros" e "motas" e guarda-los em 2 vectores dinamicos.
essa classe vai ter um metodo inserir.
depois de descodificares o ficheiro e criares os objectos tens de chamar o metodo "inserir" da classe "teste". no metodo inserir tens de verificar se os vectores estao cheios e caso estejam tens de alocar mais espaço.
consulta o exericio "Escola" das aulas PL ou o "Desenho" das aulas TPs ;)
 
Boas,
No exercicio pede para usares uma classe para gerir os objectos "carros" e "motas" e guarda-los em 2 vectores dinamicos.
essa classe vai ter um metodo inserir.
depois de descodificares o ficheiro e criares os objectos tens de chamar o metodo "inserir" da classe "teste". no metodo inserir tens de verificar se os vectores estao cheios e caso estejam tens de alocar mais espaço.
consulta o exericio "Escola" das aulas PL ou o "Desenho" das aulas TPs ;)


Olha um isepão por aqui! Obrigado amigo ja percebi o que querias dizer :)

Saudações do ISEP
 
Back
Topo