Jump to content

Armazenar em variáveis informação de um ficheiro de texto


Evenilink
 Share

Recommended Posts

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 by apocsantos
Link to comment
Share on other sites

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

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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 by Evenilink
Link to comment
Share on other sites

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

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 by apocsantos
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 by apocsantos
Link to comment
Share on other sites

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 by Localhost

here since 2009

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.