Ir ao conteúdo
  • Cadastre-se

Arquivos c++


Visitante

Posts recomendados

Olá,

Estou em um trabalho de faculdade e cheguei a um pequeno problema na hora de leitura/gravação de arquivos.

Quando fecho meu programa, o seguinte código é executado:

ofstream fout("Dados.txt");
	fout << contador_clientes << " ";
	for(int i = 1; i < contador_clientes; i++){
		fout << data[i].ID <<" "<< data[i].nome <<" "<< data[i].telefone <<" "<< data[i].endereco <<" "<< data[i].email <<" "<< data[i].CPF <<" "; 
	}

E quando abro há a opção de importar os dados salvos na ultima execução:

cout << "Deseja importar dados anteriores? ";
	cin >> op;
	if(op == "s" || op == "S"){
		ifstream fin("Dados.txt");
		fin >> contador_clientes;
		line++;
		for(int i = 1; i < contador_clientes; i++){
			string id;
			fin >> data[i].ID;
			fin >> data[i].nome;
			fin >> data[i].telefone;
			fin >> data[i].endereco;
			fin >> data[i].email;
			fin >> data[i].CPF;
		}
		fin.close();
	}

Até aí tudo bem, mas as partes do struct "data[].nome" e "data[].endereco" são strings compostas ( com espaços ), e o jeito que coloquei considera o próximo dps do espaço como próxima entrada...

Como posso mudar esses códigos pra ler esses dois completos? :x

Link para o comentário
Compartilhar em outros sites

Na manipulação de arquivos existe muitas forma de se fazer isso. Algumas formas podem ser ter a todas as entradas do mesmo tamanho em bytes, assim ler é mais fácil porque você ja sabe quantos bytes precisa ler. porém se o arquivo está serializado, certamente esses campos variam em bytes, podem conter espaços, e pior ainda poden ser uma representação da memória(binario). TAl como você descreve o problema você tem um conjunto de chars, e alguns campos possuem espaços, acho que a melhor solução é 'tokenizar' o arquivo. Essa tecnica consiste em separar os campos por algum caractere como a virgula por exemplo, você teria algo como:
"Raul Gutierres, 39, Rua Genaro São Lorenço, 1334"

Essa estrutura poderia pertencer a uma estrutura como:
struct Dados{
char nome[100];
int idade;
char nomeAvenida;
int numeroCasa;
};

Claramente é uma string na qual os campos estão separados por vírgulas, dai você aplica a tática de tokens para separar('tokenizar') a frase em palavras, parece algo complexo de aprender porém não tanto, é uma boa pratica e sem duvida, você terá que aprender isso em algum momento se quiser trabalhar como programador, assim que leia isso:

http://www.cplusplus.com/reference/cstring/strtok/

E isso também:
http://pt.stackoverflow.com/questions/95938/dividir-um-string-com-espaços-vazios

 

Nessas paginas você tem exemplos de como fazer o que você quer, é só adaptar para que trabalhe com arquivos.
Eu faria uma função que separasse um string e criar uma matriz com todas as palavras ou inclusive algo mais elegante como ler palavra por palavra do arquivo.

Espero ter ajudado. se tiver problema ponha aqui. Fui!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...