Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

beto.corujao

Carregar dados salvos em arquivo com ifstream

Recommended Posts

Bom... sou iniciante em programação e em um TP da faculdade foi solicitado a criação de uma agenda em que os dados sejam salvos em arquivo e carregados para modificação/exclusão.

 

Ocorre que todo o processo funciona perfeitamente, exceto por um detalhe: Ao carregar o os dados através do ifstream, os dados digitados nas variáveis agenda[c].nome_compromisso e agenda[c].descricao_compromisso, que contém espaço não são lidas completamente - somente até o espaço - conforme imagem abaixo:

 

http://picasaweb.google.com/beto.corujao/OutrasImagens#5363646087015678530

 

Imagem

 

Se alguém puder me ajudar, segue abaixo o trecho do código:

 

void ler_arquivo(int *recebe_lidos){//-------------------------  Ler um arquivo

  int leitura=0;

  ifstream leitor("agenda");

  if(leitor.is_open())
  {
	leitor >> leitura;
	leitor.ignore();

	  for(int c=0;c<=leitura;c++)
	  {
		leitor >> agenda[c].id;
		leitor.ignore();
		leitor >> agenda[c].nome_compromisso;
		leitor.ignore(50,'\n');
		leitor >> agenda[c].dia_compromisso;
		leitor.ignore();
		leitor >> agenda[c].hora_compromisso;
		leitor.ignore();
		leitor >> agenda[c].descricao_compromisso;
		leitor.ignore(200,'\n');
		leitor >> agenda[c].prioridade;
		leitor.ignore();

		*recebe_lidos=c;
	  }

	cout << " Dados Lidos : " << leitura << endl;
	for(int c=0;c<leitura;c++)
	{
		cout << agenda[c].id << endl
			 << agenda[c].nome_compromisso << endl
			 << agenda[c].dia_compromisso << endl
			 << agenda[c].hora_compromisso << endl
			 << agenda[c].descricao_compromisso << endl
			 << agenda[c].prioridade << endl;
	}
		cin.get();
  }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que vi, suponho que agenda[c].descricao_compromisso é uma std::string.

O problema é que o operador ">>" só lerá a string até encontrar um espaço presente na stream.

 

tente:

ifstream file("teste.txt");

    std::getline(minha_std_string, file);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que vi, suponho que agenda[c].descricao_compromisso é uma std::string.

O problema é que o operador ">>" só lerá a string até encontrar um espaço presente na stream.

 

tente:

ifstream file("teste.txt");

    std::getline(minha_std_string, file);

Bom, fiz o teste que você falou porém não compilou. Fiz dessa forma:

 

STRUCT

 

struct COMPROMISSO
{
	  int id;
	  char nome_compromisso[50];
	  int dia_compromisso;
	  int hora_compromisso;
	  char descricao_compromisso[200];
	  int prioridade;
};

 COMPROMISSO agenda[TAM];

CÓDIGO

 

  int leitura=0;

  ifstream leitor("agenda");

  if(leitor.is_open())
  {
	leitor >> leitura;
	leitor.ignore();

	  for(int c=0;c<=leitura;c++)
	  {
		leitor >> agenda[c].id;
		leitor.ignore();
		std::getline(agenda[c].nome_compromisso, leitor);
		leitor >> agenda[c].dia_compromisso;
		leitor.ignore();
		leitor >> agenda[c].hora_compromisso;
		leitor.ignore();
		std::getline(agenda[c].descricao_compromisso, leitor);
		leitor >> agenda[c].prioridade;
		leitor.ignore();

		*recebe_lidos=c;
	  }

E ocorreu a seguinte mensagem de erro:

 

prat7.cpp: In function void ler_arquivo(int*):

prat7.cpp:172: error: no matching function for call to getline(char [50], std::ifstream&)

prat7.cpp:178: error: no matching function for call to getline(char [200], std::ifstream&)

 

 

Aparentemente o std::getline não funciona com vetores, pois fiz alguns em outras situações o mesmo erro ocorreu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, erro meu...

Existem algumas funções "getline":

http://www.cplusplus.com/reference/iostream/istream/getline/

http://www.cplusplus.com/reference/string/getline/

 

A primeira trabalha com arrays de char.

 

Agora, quando estiver escrevendo em C++, use os recursos da linguagem.

char* +ara representar strings é usado em C, use std::string em C++ sempre que possível.

É mais fácil e mais seguro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.