Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: oskrg55 en 12 Agosto 2015, 05:17 am



Título: consulta lectura desde archivo
Publicado por: oskrg55 en 12 Agosto 2015, 05:17 am
hola gente tengo un problema con un codigo deseo leer codigo nombre y cedula imprimir eso digamos 234 mario mora 304060
 pero sale esto cedula 234 NOMBRE mario mora 2031 cedula 345
osea nada que ver digamos el 345 lo coge del siguiente usuario que estara mal aca codigo c++ aparte nombre es un char de 50

Código
  1. void registros()
  2. {
  3. system ("cls");
  4.    ifstream entradaRg("regEC.txt",ios::in);
  5. cout << "\t\t\tREGISTROS DEL SISTEMA...\n"<<endl;
  6. cout<< "________________________________________________________________________________\n"<<endl;
  7.    if(!entradaRg)
  8.    {
  9.        cerr<<"\t\t\aERROR!!! NO SE PUDO ABRIR EL ARCHIVO O NO EXISTEN REGISTROS\n";
  10.        exit(1);
  11.    }
  12. while (!entradaRg.eof())
  13. {
  14.  if(!entradaRg)
  15.    {
  16.        break;
  17.    }
  18.     entradaRg>>cedula;
  19.    entradaRg.getline(nombre,50);
  20.    entradaRg>>codigo;
  21.  cout << "\t\t\t\tCEDULA  [ "<<cedula<<" ]\n\t\t\t\tNOMBRE  [ "<<nombre<<" ]\n\t\t\tCODIGO DE CARTON[ "<< codigo<<" ]"<<endl;
  22.    cout<< "________________________________________________________________________________\n"<<endl;
  23.    }
  24. entradaRg.close();
  25. cout <<"Regresando al menu principal"<<endl;
  26. cout <<endl;
  27. system("pause");
  28. main();
  29. }
se agradece la ayuda


Mod: Los códigos deben ir en etiquetas GeSHi, segundo aviso


Título: Re: consulta lectura desde archivo
Publicado por: ivancea96 en 12 Agosto 2015, 14:01 pm
Código
  1. entradaRg.getline(nombre,50);

Eso lee 50 caracteres, hasta el fin de linea. Lo que implica, que salvo que casualmente el nombre tenga 50 caracteres (contando espacios), va a leerlo todo.

Lo que debes hacer es, primero, leer la linea entera:

Código
  1. string linea;
  2. getline(entradaRg, linea);

Una vez tengas la linea completa en la string, vas separando sus componentes. Por ejemplo, para sacar el primer número, harías:
Código
  1. size_t posicion;
  2. posicion = linea.find(' '); // Buscas el primer espacio, empezando desde el principio
  3. string cedulaStr = linea.substr(0,posicion); // Coge una subcadena que empieza en 0, y coge X caracteres
  4.                                                              // En este caso coincide que la posicion del espacio es el numero de caracteres
  5. cedula = stoi(cedulaStr); // Convierte la cadena numérica a un entero

Si tienes dudas de alguna función, puedes buscar en esta página. Por ejemplo, aquí ves stoi: http://www.cplusplus.com/reference/string/stoi/ (http://www.cplusplus.com/reference/string/stoi/)

Como el nombre supongo que no sabes cuantas palabras puede ser, deberías buscar primero la última parte, el código. Para ello, puedes usar rfind():

Código
  1. posicion = linea.rfind(' ');
  2. codigo = stoi( linea.substr(posicion+1) );
rfind() empieza a buscar el caracter o cadena desde el final.
Por cierto, find() y rfind() te retornan el índice de la primera ocurrencia en la string.
El segundo parámetro de find() y rfind() es opcional, y es el índice desde el que quieres empezar a buscar.


Título: Re: consulta lectura desde archivo
Publicado por: oskrg55 en 12 Agosto 2015, 20:40 pm
Esta genial ese codigo pero no habrá forma de hacerlo con caracteres esq es la parte final del programa y tendría q cambiar toda la estructura :( mas bien gracias perdón por la molestia


Título: Re: consulta lectura desde archivo
Publicado por: ivancea96 en 12 Agosto 2015, 22:26 pm
Puedes transformar una cadena a string:
Código
  1. string str(cadena); // cadena: char o char[]
  2. // O...
  3. string str = string(cadena);

A ver. Find, substr, son funciones que puedes reproducir para cadenas, pero convirtiendo a string te ahorras mucho


Título: Re: consulta lectura desde archivo
Publicado por: oskrg55 en 12 Agosto 2015, 23:14 pm
Gracias vamos a ver como sale :)