Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DarAlan en 21 Enero 2019, 21:54 pm



Título: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: DarAlan en 21 Enero 2019, 21:54 pm
Buenas tardes. Hago esta publicación para saber si alguien me ayuda a detectar un error de compilación. Mi programa debe recuperar datos de un archivo de texto usando delimitadores para almacenarlos en un objeto. Mi código es el siguiente.

/*arch es el archvio de texto, dat es el objeto donde se almacena la información,newnom,newtel y newcor son variables de tipo string*/

case 2:{
                    ifstream arch("agenda.txt",ios::in);
                    if(arch.fail()){
                       cout << "El archivo no existe o esta dañado" << endl;
                    }
                    else{
                         while(!arch.eof()){
                               arch.getline(newnom,'°');
                               arch.getline(newtel,'°');
                               arch.getline(newcor,'°');
                               dat->setNom(newnom);
                               dat->setTel(newtel);
                               dat->setCor(newcor);
                               cout << dat->getNom() << endl;
                               cout << dat->getTel() << endl;
                               cout << dat->getCor() << endl;
                         }
                    }
             break;
            }

El problema se encuentra en las líneas "arch.getline". Según codeblocks, se esperan tres parámetros en lugar de dos, pero según mi maestro, se necesita solo la variable string, y el delimitador como parámetro de la función. Estuve investigando sobre el tema y noté que algunas personas usan un numero como tercer, parámetro, pero no sé para que se utiliza. ¿Alguna idea de cuál pueda ser el error y cómo solucinarlo?.


Título: Re: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: Loretz en 21 Enero 2019, 22:19 pm
std::istream::getline
http://www.cplusplus.com/reference/istream/istream/getline/ (http://www.cplusplus.com/reference/istream/istream/getline/)

Son dos funciones
Código:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

La primera asume '\n' como delimitador; la segunda acepta el que le pongas.
Ese delimitador es el tercero de los parámetros, te está faltando el streamsize del medio.

Hay otro error además,
Código:
while(!arch.eof()){
arch activa el bit eof cuando se ha pretendido leer más allá del final, no cuando la próxima lectura pretenderá leerlo (¿cómo podría saberlo?).


Título: Re: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: DarAlan en 21 Enero 2019, 22:48 pm
Gracias por responder. ¿Entonces si es necesario el tercer parámetro?


Título: Re: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: K-YreX en 22 Enero 2019, 15:01 pm
En realidad el tercer parámetro no es obligatorio, pero el segundo sí, que es el tamaño. Lo que tú estás usando como segundo parámetro en realidad es el tercero. Por lo tanto, para tu caso son necesarios los 3 parámetros (elige un tamaño lo suficientemente grande para el segundo parámetro y listo, si sabes que vas a encontrar antes el delimitador). Suerte :-X


Título: Re: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: DarAlan en 22 Enero 2019, 21:42 pm
Gracias por responder. Probé tu solución, pero el problema persiste, aún cuando el tamaño es lo suficientemente grande para recuperar el string.


Título: Re: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: K-YreX en 23 Enero 2019, 11:39 am
Muestra a ver cómo lo has implementado y qué error te muestra :-X


Título: Re: Error al recuperar datos de fichero de texto con delimitadores
Publicado por: alpachino98 en 24 Enero 2019, 01:35 am
Lo que te pasa es que getline debe recibir un flujo de entrada como primer parámetro(el fichero), el string donde se copia y el carácter delimitador. Por cierto, si dat es un iterador de una lista, recuerda aumentar su posición en cada iteracion cada vez que lees del fichero.
Por ejemplo para un carácter delimitador de una coma seria:

Código:
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
string newNom,newCorreo,newNum;
fstream f("contactos.txt",ios::in);

if(!f.is_open())
cout<<"Error abriendo el fichero"<<endl;
else
while(!f.eof())
{
getline(f,newNom,',');
getline(f,newCorreo,',');
getline(f,newNum,',');
cout<<newNom<<endl;
cout<<newCorreo<<endl;
cout<<newNum<<endl;
}

}