Evenilink Posted March 28, 2015 at 04:53 PM Report Share #580395 Posted March 28, 2015 at 04:53 PM (edited) Boas pessoal! 😄 Tenho a seguinte dúvida: tendoum ficheiro do bloco de notas (de nome "jogos.txt") com a seguinte informação: 1 - Witcher - 2015 2 - Batman - 2015 3 - XV - 2016 Como é que faço para conseguir obter todas estas informações em variáveis? Um exemplo de código que construi: #include <iostream> #include <fstream> #include <string> #include <sstream> #include <iomanip> #include <vector> using namespace std; int main() { string escrever; ifstream ficheiro_jogos; ficheiro_jogos.open(ficheiro_jogos.append(".txt")); struct LISTA { int numero_jogos; string nome_jogos; int ano_lancamento; } lista_desejos; vector <string> armazenar_informacao(); if (ficheiro_jogos.is_open()) { for (int i = 0; i < 3; i++) { getline(ficheiro_jogo, armazenar_informacao[i]); } } } O meu objectivo é passar todas as informações do ficheiro para uma variável adequada (e mete-la depois nas variáveis da estrutura). Devémos usar um vector de strings (como eu tinha feito)? E se eu escolher abrir um ficheiro diferente (com mais 2 linhas, ou seja, 2 jogos), como é que crio o número correcto de variáveis para satisfazer o armazenamento da informação? Sei que de alguma forma tenho que usar o 'istringstream', não sei é onde o aplicar. Edited April 6, 2015 at 08:10 PM by apocsantos Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2015 at 10:18 AM Report Share #580417 Posted March 29, 2015 at 10:18 AM primeiro de tudo, tens de aclarear as ideias e interiorizar que o que pensas que seja o processo a ser realizado não é o que é necessário. depois, tens de fazer os seguintes passos: - criar um único buffer (array de caracteres) onde irás guardar as linhas lidas do ficheiro - criar um vector onde irás guardar os dados de cada registo/linha do ficheiro - instânciar uma variável/objecto/estrutura para guardar os dados lidos do registo/linha - criar um ciclo que irá ler as linhas do ficheiro - para cada linha lida, ler os dados de forma formatada (por exemplo como o sscanf) - guardar os dados lidos no vector criado anteriormente 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Evenilink Posted March 29, 2015 at 01:47 PM Author Report Share #580437 Posted March 29, 2015 at 01:47 PM (edited) Muito obrigado, segui os teus passos e consegui pôr isto a funcionar! 😄 Só mais uma coisa: na estrutura, como é que faço para as variáveis com arrays terem uma dimensão de acordo com o número de linhas do ficheiro? Visto que um array pede sempre um valor constante de tamanho, como é que é possóvel alterar isso? Edited March 29, 2015 at 02:18 PM by Evenilink Link to comment Share on other sites More sharing options...
banaipe Posted March 30, 2015 at 07:21 PM Report Share #580512 Posted March 30, 2015 at 07:21 PM Muito obrigado, segui os teus passos e consegui pôr isto a funcionar! 😄 Só mais uma coisa: na estrutura, como é que faço para as variáveis com arrays terem uma dimensão de acordo com o número de linhas do ficheiro? Visto que um array pede sempre um valor constante de tamanho, como é que é possóvel alterar isso? Dá uma vista de olhos em http://goo.gl/lxTtD1 (Memória Dinâmica) Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 30, 2015 at 07:32 PM Report Share #580513 Posted March 30, 2015 at 07:32 PM não necessitas de pensar nisso ... usa um vector ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Evenilink Posted April 4, 2015 at 04:12 PM Author Report Share #580782 Posted April 4, 2015 at 04:12 PM (edited) Obrigado banaipe, mas realmente acho melhor usar vectores... Mas como? Estando isto na LISTA: vector <int> numero; vector <string> nome; vector <int> ano; Já tentei fazer uma coisa assim: string linhas_lidas; if (ficheiro.is_open()) { while (getline(ficheiro, linhas_lidas)) { string lixo; istringstream instr(linhas_lidas); instr >> lista.numero[i] >> lixo >> lista.nome[i] >> lixo >> lista.ano[i]; i++; } } Já tentei colocar isso mas dá erro... Quer isso dizer que tenho de alucar espaço para os vectores na mesma? Edited April 6, 2015 at 08:10 PM by apocsantos Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 4, 2015 at 04:36 PM Report Share #580783 Posted April 4, 2015 at 04:36 PM isto é o que tens no teu primeiro post: struct LISTA { int numero_jogos; string nome_jogos; int ano_lancamento; } lista_desejos; vector <string> armazenar_informacao(); bastaria teres: struct Desejo { int numero_jogos; string nome_jogos; int ano_lancamento; }; vector <struct Desejo> lista; // ... struct Desejo registo; lista.push_back(registo); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Evenilink Posted April 4, 2015 at 05:53 PM Author Report Share #580787 Posted April 4, 2015 at 05:53 PM (edited) Ah, pensava que os vectores tinham de estar dentro da lista. E se quiser aceder, por exemplo, à string "Batman", como faço? Penso que o código estará correcto, a minhá dúvida é o que meto onde tem os pontos de interrogação para aparecer esse jogo. BTW, muito obrigado pela ajuda até agora! 😄 #include <iostream> #include <fstream> //usado para usar 'ifstream' #include <string> #include <sstream> //poder usar stringstream #include <iomanip> //poder usar setw (penso eu) #include <vector> #include <windows.h> using namespace std; int main() { string nome_ficheiro; cout << "Introduz ficheiro: "; getline(cin, nome_ficheiro); struct Desejo { int numero_jogos; string nome_jogos; int ano_lancamento; }; vector <struct Desejo> lista; struct Desejo registo; ifstream ficheiro; ficheiro.open(nome_ficheiro.append(".txt")); string linhas_lidas; if (ficheiro.is_open()) { while (getline(ficheiro, linhas_lidas)) { string lixo; istringstream instr(linhas_lidas); instr >> registo.numero_jogos >> lixo >> registo.nome_jogos >> lixo >> registo.ano_lancamento; lista.push_back(registo); } } cout << ?????????????????? << endl; } Edited April 6, 2015 at 08:10 PM by apocsantos Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 4, 2015 at 06:13 PM Report Share #580792 Posted April 4, 2015 at 06:13 PM a maneira mais simpels é usares iteradores que irão ser usados para navegar pelos registos do vector http://www.cplusplus.com/reference/vector/vector/begin/ IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Localhost Posted April 5, 2015 at 04:20 PM Report Share #580818 Posted April 5, 2015 at 04:20 PM (edited) Ah, pensava que os vectores tinham de estar dentro da lista. E se quiser aceder, por exemplo, à string "Batman", como faço? Penso que o código estará correcto, a minhá dúvida é o que meto onde tem os pontos de interrogação para aparecer esse jogo. BTW, muito obrigado pela ajuda até agora! 😄 #include <iostream> #include <fstream> //usado para usar 'ifstream' #include <string> #include <sstream> //poder usar stringstream #include <iomanip> //poder usar setw (penso eu) #include <vector> #include <windows.h> using namespace std; int main() { string nome_ficheiro; cout << "Introduz ficheiro: "; getline(cin, nome_ficheiro); struct Desejo { int numero_jogos; string nome_jogos; int ano_lancamento; }; vector <struct Desejo> lista; struct Desejo registo; ifstream ficheiro; ficheiro.open(nome_ficheiro.append(".txt")); string linhas_lidas; if (ficheiro.is_open()) { while (getline(ficheiro, linhas_lidas)) { string lixo; istringstream instr(linhas_lidas); instr >> registo.numero_jogos >> lixo >> registo.nome_jogos >> lixo >> registo.ano_lancamento; lista.push_back(registo); } } cout << ?????????????????? << endl; } Boas. Vê se isto te ajuda :-) vector<struct Desejo>::iterator itr = registo.begin (); // inicio do vector while ((itr++) != registo.end ()) cout << (itr -> nome_jogos) << endl; Não testei mas creio que funcione. Cumprimentos. Edited April 5, 2015 at 04:22 PM by Localhost here since 2009 Link to comment Share on other sites More sharing options...
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