0

estoy con la cuestión de hacer un directorio telefónico. Me salta el error que coloque en el título, en la línea "getline(dato,numero, nombre);"(por cierto, esta casi al final señalada con un comentario) y no se a que se debe.

/*programa para crear un archivo de texto, leer y agregar directorios telefonicos*/
  #include<stdio.h> //para el printf y el scanf
  #include<fstream> //para trabajar con los archivos
  #include<iostream>
  using namespace std;
  int opcion; //la variable para las opciones del switch
  string nombre; //la variable para guardar el nombre del contacto
  int numero; //la variable para guardar el numero de telefono

  int main(){ //funcion principal
  printf("Directorios telefonicos\n\n Opciones:\n 1-Crear archivo de 
  texto\n2-Agregar contactos\n3-Leer datos");
  //la linea anterior es como luciria el menu
  printf("\nIngresa una opcion:");
  cin>>opcion;
  system("cls");
  //limpiado luego de ingresar la opcion
  //empieza el switch
  switch(opcion){
    case 1:
        void crear();
        break;
    case 2:
        void agregar();
        break; 
    case 3:
        void leer();
        break;
    default:
        printf("Solo se admiten numeros del 1 al 3");   
               }//fin switch 
cin.get();
cin.get();
}
//fin funcion principal main


void crear(){ //funcion para crear el archivo de texto
    ofstream dato;
    string nombredArchivo;
    printf("Ingrese el nombre para el archivo:");
    getline(cin,nombredArchivo);
    dato.open(nombredArchivo.c_str(), ios::out);
    printf("El archivo se ha creado correctamente");
    dato.close();
              }

void agregar(){ //funcion para agregar contactos en el mismo documento
    string nombredArchivo;
    ofstream dato(nombredArchivo.c_str(), ios::app);
    printf("Agregar datos\nNombre:");
    getline(cin,nombre);
    fflush(stdin);
    printf("\nNumero de telefono local:");
    scanf("%i", &numero);
    fflush(stdin);
    dato<<"\n"<<nombre;
    dato<<"\n"<<numero;
    dato.close();
}

void leer(){ //funcion para leer el documento
    string nombredArchivo;
    ifstream dato;
    dato.open(nombredArchivo.c_str(),ios::in);
    if(dato.fail()){
        printf("No se pudo abrir el archivo");
        exit(1);        
    }
    while(!dato.eof()){
        getline(dato,numero, nombre);//aca da el error
        cout<<nombre<<numero<<endl;
    }
    dato.close();
}
gbianchi
  • 19,675
  • 11
  • 38
  • 58
Mist Chery
  • 13
  • 4

1 Answers1

2

Me salta el error no matching function for call to 'getline(std::ifstream&, int&, std::string&)' y no se a que se debe.

Se debe principalmente a que no has leído el manual o no has echado un vistazo a la ayuda en pantalla que te ofrece DevC++.


La función std::getline dispone de cuatro sobrecargas y ninguna de ellas recibe como parámetros un std::ifstream junto a un int y un std::string. La función std::getline, como su nombre indica sirve para obtener una línea de texto de un flujo (stream) de datos; parece que tú la estás usando para obtener dos datos separados.

Por lo que puedo entender en tu función agregar, cada entrada en tu directorio telefónico está compuesta de pares líneas, siendo la primera el nombre del contacto y la segunda el teléfono del mismo, así pues deberías obtener los datos así:

void leer() {
    string nombredArchivo;
    ifstream dato;
    dato.open(nombredArchivo.c_str(),ios::in);
    if(dato.fail()){
        printf("No se pudo abrir el archivo");
        exit(1);        
    }
    while(!dato.eof()){
        dato >> nombre;
        dato >> numero;
        cout<<nombre<<numero<<endl;
    }
    dato.close();
}

Tan sencillo como eso.

Otras cosas a tener en cuenta.

Te aconsejo echar un vistazo a tu anterior pregunta en que he señalado varias cosas que deberías mejorar de tu código:

  • No uses variables globales; en C++ se aconseja que las variables tengan el ámbito más pequeño posible.
  • No uses la cláusula using namespace en ámbito global.
  • Usas la cabecera <string> sin incluirla, ésta cabecera se incluye a través de otras cabeceras estándar pero no debes confiar en que eso se mantendrá así, por lo que es necesario incluirla si la usas.
  • El ofstream se puede construir pasándole el nombre del archivo a tratar, no es necesario llamar a open.
  • La función main debe devolver un valor.
  • No uses <stdio.h>, y si tienes que usarlo (que no deberías en este código) usa su versión C++: <cstdio> (lee este hilo para saber por qué).
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82