Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: UserLoser en 20 Enero 2019, 16:55 pm



Título: getline
Publicado por: UserLoser en 20 Enero 2019, 16:55 pm
Hola a todos. Llevo unos días aprendiendo a programar y este es el primer problema al que no le veo solución.
En el siguiente programa, el getline hace como si no existiera.Directamente no hace nada. Lo he probado en otro mini-programa y funciona perfectamente, pero en éste no.¿Sabéis qué sucede?

Código:
#include <iostream>
#include <fstream>
using namespace std;

void EscribirEnFichero();
void LeerEnFichero();

int main(){
string PreguntaLeerOEscribir;
Vuelta1:
cout<<"Desea (E)scribir o (L)eer un archivo"<<endl;
cin>> PreguntaLeerOEscribir;
if ((PreguntaLeerOEscribir=="E") || (PreguntaLeerOEscribir=="e")){
EscribirEnFichero();
}
else if ((PreguntaLeerOEscribir=="L") || (PreguntaLeerOEscribir=="l")){
LeerEnFichero();
}
else {
cout<<"No ha escrito una opcion valida.Intentelo otra vez"<<endl;
goto Vuelta1;
}
return 0;
}

void EscribirEnFichero(){
char NombreArchivo[128];
string Texto;
cout<<"Que nombre desea que tenga el archivo"<<endl;
cin>>NombreArchivo;
cout<<"Que desea escribir en el archivo"<<endl;
getline(cin,Texto);                       //Este es el getline que no funciona

ofstream fichero (NombreArchivo);
fichero<<Texto<<endl;
fichero.close();

system("pause()");
}

void LeerEnFichero(){

}


Título: Re: getline
Publicado por: K-YreX en 20 Enero 2019, 17:27 pm
Lo primero de todo pon tu código entre etiquetas de código GeSHi (dando a modificar mensaje y encima del cuadro de texto tienes la opción para elegirlas).

El problema que tienes es típico cuando se trabaja con cadenas de caracteres. Al introducir el nombre del archivo, introduces el nombre y le das a enter. Ese enter se queda en el buffer y cuando pides el texto, el enter del buffer pasa a la variable <Texto>. Por eso parece que se lo salta y si te fijas en el archivo creado tiene un salto de línea guardado.

En este mismo foro hay varios temas para tratar ese problema del buffer. Por favor, no uses el típico <fflush(stdin)> ya que para algo hemos tratado de buscar alternativas más correctas en los temas que te comento.

Aparte de eso te recomiendo que si vas a usar <string>, no mezcles con cadenas de <char>. Si creas un <string> para guardar el nombre del archivo luego sólo tienes que hacer esto para poder abrir el archivo:
Código
  1. string nombre_fichero = "nuevo.txt";
  2. ofstream fichero(nombre_fichero.c_str());
Con ese método transformas un <string> en una cadena <char>.

También te recomiendo que en vez de usar etiquetas y <goto()>, emplees un filtro <do while>. Lo que tú has hecho está más relacionado con implementaciones a bajo nivel. En lenguajes de alto nivel hay otras opciones como la que te he comentado, es más correcto.

Y en vez de usar <system("pause")>, te recomiendo usar <cin.get()>, el resultado es el mismo y te evitas hacer una llamada al sistema, lo cual es más costoso.

Suerte :-X


Título: Re: getline
Publicado por: UserLoser en 20 Enero 2019, 17:46 pm
Muchas gracias, YreX-DwX, voy a buscar esos temas que mencionas. Ya he hecho lo del string, y voy a pensar como meter el do while, jeje.
Gracias de nuevo.


Título: Re: getline
Publicado por: K-YreX en 20 Enero 2019, 18:05 pm
Aquí (https://foro.elhacker.net/programacion_cc/iquestqueda_algo_en_el_buffer_de_entrada_stdin_solucionado-t489993.0.html) te dejo el enlace al tema, ya que sino se te va a hacer un poco largo encontrarlo. Suerte :-X