Ir para conteúdo

POWERED BY:

Arquivado

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

~TiAgO

Problema ao ler arquivo .txt

Recommended Posts

Olá galera, gostaria de uma ajudinha aqui no programa.

Quero ler um arquivo .txt contendo o modelo "Nome Completo""(espaço)""Nota1""Nota2""Nota3" abaixo

 

Carlos Eduardo 23.0 32.3 27.4
Carlos Rezende 28.0 29.0 30.0
Beatriz Couto 25.6 28.6 30.0
Ebert Silva 18.0 12.3 07.4
Frederico Severo 19.5 27.6 23.9
Heraldo Gomes 23.5 05.7 17.0
Rafael Oliveira 14.3 12.5 31.1
Tadeu Silva 23.0 15.7 22.4 
Joao Castro 12.1 22.0 31.2
Ronaldo Pedrosa  18.0 12.3 09.9
Pedro Swartz 13.5 05.7 11.0
Camila Saldanha 02.0 01.3 08.4
Joana Silva 29.5 27.6 31.9
Tatiana Costa 12.3 25.5 21.1
Tiago Costa 24.2 32.1 31.3
Luiza Coutinho 31.6 21.6 30.0
Barbara Stuart 03.0 05.7 12.4
Samuel Fausto 16.3 15.5 31.1
Fernando Xouts 23.6 23.6 19.0
Roberto Fontana 22.0 31.3 17.4

 

 

Meu programa está assim:

 

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])

{ifstream le("dados.txt"); // arquivo de leitura

char nome[20];
le.get(nome,20); // le e armazena em nome, 20 caracteres, incluindo brancos.
float n1, n2, n3, i;

le >> n1 >> n2 >> n3; // le os 3 valores reais armazenando em n1, n2 e n3.

cout << nome;
cout << n1;
cout << "   ";
cout << n2;
cout<< " ";
cout<< n3 << "\n"; // imprime os valores lidos.
cin.ignore(10,'\n'); // ignora até 10 caracteres ou até encontrar o fim de linha ‘\n’



	system("PAUSE");
	return EXIT_SUCCESS;
}
No entanto está lendo apenas o primeiro contato e a terceira nota apenas.

Gostaria de uma ajudinha da galera.

vlw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui voce esta lendo os 20 primeiros caracteres do arquivo, só que o nome do primeiro registro precisa de apenas 15 (14 letras + o '\0') Os 5 caracteres que sobram ele continua lendo e acaba pegando tb um pedaco da nota e gravando como nome.

le.get(nome,20);

Executando seu codigo minhas saidas foram as seguintes

nome = Carlos Eduardo 23.0
n1 = 32.3
n2 = 27.4
n3 = sujeira de memoria

Assim, sem pensar muito, uma solucao simplista é inserir mais um dado no data.txt, antes do nome colocar a quantidade de caracteres do nome. Entao quando ler o arquivo, jogar para uma variavel esse primeiro valor e dar um get na quantidade de caracteres do nome.

 

alguma coisa assim

14Carlos Eduardo 23.0 32.3 27.4
int tamanho = 0;
le >> tamanho;
le.get(nome,tamanho+1 );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou então é jogar a linha inteira para uma string, e ler essa string com:

sscanf(string, "%s %s %f %f %f", &nome, &sobrenome, &n1, &n2, &n3)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode colocar um delimitador entre o nome e as notas e utilizar a seguinte sintaxe do método get:

 

istream &get( char *buffer, streamsize num, char delim );

reads characters into buffer until num - 1 characters have been read, or EOF or the delim character encountered (delim is not read until next time)

Logo após você deve dar um get() sem parâmetros para eliminar o delimitador que vai ficar ali.

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.