~TiAgO 0 Denunciar post Postado Junho 25, 2009 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
Myho 2 Denunciar post Postado Junho 27, 2009 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
VictorCacciari 42 Denunciar post Postado Junho 28, 2009 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
José Enésio 4 Denunciar post Postado Junho 28, 2009 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
omar.pessoa 1 Denunciar post Postado Junho 29, 2009 Acho que começando do fim da linha"\r\n" é a melhor opção! Compartilhar este post Link para o post Compartilhar em outros sites