machi Posted December 17, 2006 at 02:31 AM Report #70901 Posted December 17, 2006 at 02:31 AM 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? ?
Rui Carlos Posted December 17, 2006 at 12:02 PM Report #70918 Posted December 17, 2006 at 12:02 PM 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; } Rui Carlos Gonçalves
machi Posted December 18, 2006 at 06:20 PM Author Report #71229 Posted December 18, 2006 at 06:20 PM 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).)
Rui Carlos Posted December 18, 2006 at 06:31 PM Report #71233 Posted December 18, 2006 at 06:31 PM 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. Rui Carlos Gonçalves
machi Posted December 18, 2006 at 07:17 PM Author Report #71246 Posted December 18, 2006 at 07:17 PM 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 ??
Rui Carlos Posted December 18, 2006 at 09:38 PM Report #71268 Posted December 18, 2006 at 09:38 PM Aplica-se o mesmo ?? não percebi a dúvida 😛 Rui Carlos Gonçalves
Halaster Posted December 18, 2006 at 10:13 PM Report #71273 Posted December 18, 2006 at 10:13 PM 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?
machi Posted December 19, 2006 at 12:53 AM Author Report #71300 Posted December 19, 2006 at 12:53 AM 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á.
Rui Carlos Posted December 19, 2006 at 01:02 AM Report #71301 Posted December 19, 2006 at 01:02 AM 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; } Rui Carlos Gonçalves
brink@ero Posted December 19, 2006 at 07:06 PM Report #71416 Posted December 19, 2006 at 07:06 PM 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 👍
Rui Carlos Posted December 19, 2006 at 07:43 PM Report #71422 Posted December 19, 2006 at 07:43 PM 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. Rui Carlos Gonçalves
machi Posted December 20, 2006 at 12:34 AM Author Report #71471 Posted December 20, 2006 at 12:34 AM Já consegui fazer a leitura! 👍 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.
brink@ero Posted December 20, 2006 at 11:48 AM Report #71515 Posted December 20, 2006 at 11:48 AM 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 👍
Rui Carlos Posted December 20, 2006 at 12:03 PM Report #71518 Posted December 20, 2006 at 12:03 PM 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... Rui Carlos Gonçalves
machi Posted December 27, 2006 at 07:56 PM Author Report #72766 Posted December 27, 2006 at 07:56 PM Tá resolvido! 😁 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! 😉
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now