1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C++] Leitura de ficheiro

Discussão em 'Programação' iniciada por JomarC, 15 de Outubro de 2008. (Respostas: 12; Visualizações: 1226)

  1. JomarC

    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
     
  2. OubeLa

    OubeLa Power Member

    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, ....)
     
  3. JomarC

    JomarC Power Member

    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: 26 de Outubro de 2008
  4. OubeLa

    OubeLa Power Member

    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.
     
  5. bsd

    bsd Power Member

    É 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);
      ...
    
     
  6. IComeFromBehind

    IComeFromBehind Power Member

  7. JomarC

    JomarC Power Member

    Como e que eu faço um ciclo while para ele apenas ler a linha ate encontrar um ENTER?
     
  8. OubeLa

    OubeLa Power Member

    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.
     
  9. JomarC

    JomarC Power Member

    Ja consegui guardar os atributos nas strings.

    Agora como e que chamo o construtor e guardo nos vectores?
     
  10. OubeLa

    OubeLa Power Member

    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.
     
  11. PJTuga

    PJTuga Power Member

    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 ;)
     
  12. JomarC

    JomarC Power Member

    Mas o tipo de vectores que eu tenho e do tipo:

    Carro* *carro;

    Ainda nao tou a utilizar templates...digo eu!
     
  13. JomarC

    JomarC Power Member


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

    Saudações do ISEP
     

Partilhar esta Página