Error al recuperar datos de fichero de texto con delimitadores

Iniciado por DarAlan, 21 Enero 2019, 21:54 PM

0 Miembros y 1 Visitante están viendo este tema.

DarAlan

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?.

Loretz

std::istream::getline
http://www.cplusplus.com/reference/istream/istream/getline/

Son dos funciones
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,
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?).

DarAlan

Gracias por responder. ¿Entonces si es necesario el tercer parámetro?

K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

DarAlan

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.

K-YreX

Muestra a ver cómo lo has implementado y qué error te muestra :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

alpachino98

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:

#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;
}

}