• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

machi

[C++] Ajuda: Leitura de Ficheiro e inserção em Lista (Resolvido)

15 mensagens neste tópico

Estou com alguns problemas para conseguir codificar o que pretendo.

Como ler os dados de um determinado ficheiro e de seguida envia-los para uma lista, para que possa depois trabalhar a partir da lista?

:hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depende de como estão os dados no ficheiro...

o seguinte programa lê números inteiros de um ficheiro e imprime-os.

no teu caso ias ler os valores (inteiros ou não) de um ficheiro e colocá-los numa lista.

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
  ifstream file;
  file.open("f.txt");

  int i;
  while(file >> i)
    cout << i << endl;

  cout << "Fim" << endl;

  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aproveitando este tópico...

ifstream f("musica.txt");
while (!f.eof())
{
   char mens[50];
   f.getline(mens,50);
   m_Listagem.AddString(mens); 
}
f.close();

Como fazer para que ao ler o ficheiro "musica.txt" só me vá ler um dado campo da classe musica?

Isto é , tenho os campos Nome, Autor,Album, etc.. e ir so buscar o Nome...

(A variável m_Listagem é para enviar o Nome para uma ListBox  (MFC).)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

aí já vais ter que fazer parsing da string.

admitindo que os campos estão separados por vírgulas, vais aproveitar apenas os caracteres até à primeira vírgula.

podes percorrer a string 'mens' até encontrares uma vírgula e substituir-la por um '\0'.

se usares strings do C++ vais ter métodos que te facilitam o trabalho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para guardar é desta forma:

void Musica::GravarFicheiro(ofstream &f)
{
f<<contagem<<endl;
f<<Nome<<endl;
f<<Album<<endl;
f<<Autor<<endl;
f<<Tipo<<endl;
}

Aplica-se o mesmo ??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para guardar é desta forma:

void Musica::GravarFicheiro(ofstream &f)
{
f<<contagem<<endl;
f<<Nome<<endl;
f<<Album<<endl;
f<<Autor<<endl;
f<<Tipo<<endl;
}

Aplica-se o mesmo ??

Com esse codigo, o que vai ficar no ficheiro é uma coisa deste género:

Conteúdo Ficheiro:

contagem

nome

album

autor

tipo

É isso que queres?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa por não me ter explicado bem!

O que fica no ficheiro eu sei o que é.

Agora não sei é como ir buscar só o nome da musica.

Apenas sei ler todo o conteúdo, mas ler só um determinado campo não sei..

E pelo modo que o Rui Carlos disse não sei se funcionará.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu assumi que tinhas as várias componentes separadas por vírgulas...

agora se estão em linhas diferentes (tendo em conta a função GravarFicheiro) a coisa ainda é mais simples...

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
  ifstream file;
  file.open("f.txt");

  string tmp;
  int i=1;
  while(getline(file,tmp))
  {
    if(i%5==2) cout << tmp << endl;
    i++;
  }

  cout << "Fim" << endl;

  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa por não me ter explicado bem!

O que fica no ficheiro eu sei o que é.

Agora não sei é como ir buscar só o nome da musica.

Apenas sei ler todo o conteúdo, mas ler só um determinado campo não sei..

E pelo modo que o Rui Carlos disse não sei se funcionará.

O modo de leitura dum ficheiro é igual ao modo de escrita... por isso seria algo do género:

void Musica::LerFicheiro(ifstream &f)
{
f>>contagem;
f>>Nome;
f>>Album;
f>>Autor;
f>>Tipo;
}

(como não tenho um compilador aqui para testar, acho que precisa duma afinação por causa dos "endl", mas de resto isto funciona).

Se queres só um campo de cada um deles (por exemplo o nome da música), existe pelo menos dois caminhos:

-Lês o ficheiro todo, guardando todos os dados numa classe/estrutura/fila de estruturas/anel de estruturas/etc... , e depois crias uma função que retira só os títulos da música (este é o que eu prefiro). Ou lês o ficheiro todo e simplesmente ignoras o que não queres...

-A outra maneira é manipular o apontador/cursor da leitura, para isso tinhas de saber a posição inicial de cada nome de música (por exemplo). Como cada dado (nome da música, autor...) tem um número de caracteres desconhecido, terias de fazer um varrimento do ficheiro à procura do "char endl" ou '\n', e guardar a sua posição. Depois se queres aceder à linha 12, já sabes para onde deves por o apontador...

Cumpr. bk@ero  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

void Musica::LerFicheiro(ifstream &f)
{
f>>contagem;
f>>Nome;
f>>Album;
f>>Autor;
f>>Tipo;
}

assim à primeira vista isto só funciona se os vários campos não tiverem espaços...

parece-me que o 'getline' é o mais adequado a esta situação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui fazer a leitura! :thumbsup:

 ifstream f("musicas.txt");
		while (!f.eof())
		{
			char mens[20];
			f.getline(mens, 20);
			m_Listagem.AddString(mens);  // para enviar os dados para uma Listbox
		}
		f.close();

Aqui é que estava o erro :

Ao inserir na Listbox o programa bloqueava.

void Musica::LerFicheiro(ifstream &f)
{
>>contagem;   // <-- nao estava a ler pa lado nenhum 
f>>Nome;
f>>Album;
f>>Autor;
f>>Tipo;
}

Agora só me falta por apenas o nome da música a aparecer.

Estão a aparecer ainda todos os dados.

Vou tentar utilizar a explicação do brink@ero para ver se consigo então ler apenas o nome da música.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

void Musica::LerFicheiro(ifstream &f)
{
f>>contagem;
f>>Nome;
f>>Album;
f>>Autor;
f>>Tipo;
}

assim à primeira vista isto só funciona se os vários campos não tiverem espaços...

parece-me que o 'getline' é o mais adequado a esta situação.

Já testei e funciona perfeitamente, os vários campos podem estar separados por espaços (1 ou mais), por tab ou por '\n'.

O único problema são as strings, se estas tiverem mais do que uma palavra separada por espaços, só é efectuado a leitura da primeira palavra, a seguinte é lida na instrução seguinte.

Por isso o que aconselho é, como já foi referido, o getline para ler strings, o resto (números, char ou campos de uma só palavra) ler como escreves, assim não tens o trabalho converter a string num número (por exemplo).

Cumpr. bk@ero  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O único problema são as strings, se estas tiverem mais do que uma palavra separada por espaços, só é efectuado a leitura da primeira palavra, a seguinte é lida na instrução seguinte.

era a isso que eu me referia...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tá resolvido!  :biggrin:

Bastou o seguinte com o getline:

void Musica::LerFicheiro(ifstream &f)
{
f.getline(Nome, 20);
f.getline(Album, 20);
f.getline(Autor, 20);
f.getline(Tipo, 20);
}

Um dos casos em que é utilizado é o seguinte:

ifstream f("musicas.txt");
while (!f.eof())
{
        	Musica *M = new Musica();
        M->LerFicheiro(f);
        m_Listagem.AddString(M->DevNome());
        LM->Inserir(M);
}
        f.close();

Desta forma é possivel ler então ou o nome ou qualquer outra coisa que se queira para uma listbox;)

0

Partilhar esta mensagem


Link 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