Foros del Web » Programación para mayores de 30 ;) » C/C++ »

"Ayuda con getline y strings" (Solucionado) Error en visual studio 6.0

Estas en el tema de "Ayuda con getline y strings" (Solucionado) Error en visual studio 6.0 en el foro de C/C++ en Foros del Web. Bueno quisiera ver si me podrian ayudar. Tengo el siguiente codigo el cual me pide que inserte una oracion, el problemas es que tengo que ...
  #1 (permalink)  
Antiguo 05/04/2010, 01:04
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 1 mes
Puntos: 0
Exclamación "Ayuda con getline y strings" (Solucionado) Error en visual studio 6.0

Bueno quisiera ver si me podrian ayudar. Tengo el siguiente codigo el cual me pide que inserte una oracion, el problemas es que tengo que dar doble ENTER para que me muestre el siguiente cout, quisiera saber cual es mi error o como puedo solucionarlo.Para que con un solo enter pase al siguiente cout.

Código C++:
Ver original
  1. #include<iostream>
  2. #include<string>
  3. #include<conio.h>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    string oracion;
  9.    cout<<"Escribe una oracion: ";
  10.    getline(cin,oracion);
  11.    cout<<"Has escrito: " <<oracion<<endl;
  12.    getch();
  13.    return 0;
  14. }

Se los ruego por favor ayudenme con este problema ya tengo bastante con esto y no se cual es el error, busco y busco informacion en internet y no encuentro mi error. se los agradecere mucho

Actualizacion:
Yo estoy programando en Visual studio 6.0 lo probe en Dev-c++ 4.9.9.2, y tambien trate con visual studio 2008 y si funciono bien. En Devc++ y en visual 2008 me funciono perfectamente con un solo clic pasa al siguiente cout,

Ahora mi pregunta es a que se debe esto?

Actualizacion:

Ya encontre el problema en si es que el getline lee un caracter adicional despues de encontrar el delimitador (en la version 6.0) por eso en el Dev o en el visual 2008 no pasa esto, la solucion es modificar la función de miembro getline si les interesa saber como al final de esta pagina esta el link donde se menciona el problema y una pequeña explicacion mia de como hacer esta modificaion.

Última edición por jose_desa; 06/04/2010 a las 00:28 Razón: actualizacion
  #2 (permalink)  
Antiguo 05/04/2010, 06:17
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Ayuda con getline y strings

Te recomiendo que revises tu tecla enter..!!!

pues probe tu codigo y corre bien, con un solo enter sale el otro cout.
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #3 (permalink)  
Antiguo 05/04/2010, 09:20
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años, 1 mes
Puntos: 71
Respuesta: Ayuda con getline y strings

Te recomiendo que uses despues de
Código C++:
Ver original
  1. getline(cin,oracion);

fflush(stdout);

Suerte.
  #4 (permalink)  
Antiguo 05/04/2010, 12:22
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ayuda con getline y strings

Ya probe mi programa en otra computadora y sigue igual. tambien trate poniendo el fflush quedandome el codigo asi:
Código C++:
Ver original
  1. #include<iostream>
  2. #include<string>
  3. #include<conio.h>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. string oracion;
  9. cout<<"Escribe una oracion: ";
  10. getline(cin,oracion);
  11. fflush(stdout);
  12. cout<<"Has escrito: " <<oracion<<endl;
  13. return 0;
  14. }

y tampoco funciono. Luego se me ocurrio hacer este mismo programa en otro compilador (yo estoy programando en Visual studio 6.0) lo probe en Dev-c++ 4.9.9.2, tambien trate con visual studio 2008 y si funciono bien, en Devc++ y en visual 2008 me funciono perfectamente con un solo clic pasa al siguiente cout, Ahora mi pregunta es a que se debe esto?

Última edición por jose_desa; 05/04/2010 a las 14:43 Razón: complementar
  #5 (permalink)  
Antiguo 05/04/2010, 17:13
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ayuda con getline y strings

he encontrado el problema en la pagina de soporte de microsoft, dice que efectivamente el getline lee un caracter adicional despues de encontrar el delimitador (en la version 6.0), ahora mi problema es que dice que debo modificar la funcion miembro getline seria lo siguiente:

Modify the getline member function, which can be found in the following system header file string, as follows:
Código C++:
Ver original
  1. else if (_Tr::eq((_E)_C, _D))
  2.                 {_Chg = true;
  3.               //  _I.rdbuf()->snextc(); /* Remove this line and add the line below.*/
  4.           _I.rdbuf()->sbumpc();
  5.                 break; }

traducido seria:
Modificar la función de miembro getline , que puede encontrarse en la siguiente cadena de archivo de encabezado del sistema, como sigue:
Código C++:
Ver original
  1. else if (_Tr::eq((_E)_C, _D))
  2.                 {_Chg = true;
  3.               //  _I.rdbuf()->snextc(); /* Remove this line and add the line below.*/
  4.           _I.rdbuf()->sbumpc();
  5.                 break; }


Pagina: http://support.microsoft.com/kb/240015

Mi duda es como puedo modificarlo, como puedo accesar a donde dice (creo que seria el encabezado del sistema)????
Por favor ayudenme
  #6 (permalink)  
Antiguo 05/04/2010, 18:13
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ayuda con getline y strings

Cita:
he encontrado el problema en la pagina de soporte de microsoft, dice que efectivamente el getline lee un caracter adicional despues de encontrar el delimitador (en la version 6.0)hora mi problema es que dice que debo modificar la funcion miembro getline......
Ya lo solucione, por fin. Bueno por si alguien le interesa saber como reparar este error:

La ruta del archivo al menos en mi computadora es la siguiente:
C:\Archivos de programa\Microsoft Visual Studio\VC98\Include
Si no la encuentrar deben buscar en que unidad se intalalo su visual studio y en si encontrar la ruta "\VC98\Include"

una vez ahi puede ordenarlo en orden alfabetico y busquen el archivo STRING (no tiene ninguna extension ni .h ni .cpp ni nada, a mi me aparece sin icono) luego pueden hacer 2 cosas:

1. abrir el visual c++ y arrastrar el archivo que menciono(STRING) al documento para que se los abra para poder modificarlo.

2.Dar doble clic al archivo(STRING) y escoger "Abrir con" Bloc de notas

Independientemente de la opcion que escojas una vez abierto el archivo, te va a parecer mucho codigo que lo primero que les dice es:

Código C++:
Ver original
  1. // string standard header
  2. #if     _MSC_VER > 1000
  3. #pragma once
  4. #endif
  5.  
  6. #ifndef _STRING_
  7. #define _STRING_
  8. #include <istream>
....
.
.

Luego se van hasta mas o menos la mitad del documento y les va a aprecer el siguiente codigo:

Código C++:
Ver original
  1. if (_Ok)
  2.         {_TRY_IO_BEGIN
  3.         _Tr::int_type _C = _I.rdbuf()->sgetc();
  4.         for (; ; _C = _I.rdbuf()->snextc())
  5.             if (_Tr::eq_int_type(_Tr::eof(), _C))
  6.                 {_St |= ios_base::eofbit;
  7.                 break; }
  8.             else if (_Tr::eq((_E)_C, _D))
  9.                 {_Chg = true;
  10.                   _I.rdbuf()->snextc();
  11.                 break; }
  12.             else if (_X.max_size() <= _X.size())
  13.                 {_St |= ios_base::failbit;
  14.                 break; }
  15.             else
  16.                 _X += _Tr::to_char_type(_C), _Chg = true;
  17.         _CATCH_IO_(_I); }
  18.     if (!_Chg)
  19.         _St |= ios_base::failbit;
  20.     _I.setstate(_St);
  21.     return (_I); }
  22. template<class _E, class _Tr, class _A> inline

Aqui lo que deben modificar es la linea 10:
_I.rdbuf()->snextc(); y cambiar la por esta otra _I.rdbuf()->sbumpc();
quedando el codigo asi:


Código C++:
Ver original
  1. if (_Ok)
  2.         {_TRY_IO_BEGIN
  3.         _Tr::int_type _C = _I.rdbuf()->sgetc();
  4.         for (; ; _C = _I.rdbuf()->snextc())
  5.             if (_Tr::eq_int_type(_Tr::eof(), _C))
  6.                 {_St |= ios_base::eofbit;
  7.                 break; }
  8.             else if (_Tr::eq((_E)_C, _D))
  9.                 {_Chg = true;
  10.                   //_I.rdbuf()->snextc(); /*Esta linea se quita o se pone en comentarios*/
  11.                     _I.rdbuf()->sbumpc(); //esta es la que la reemplaza
  12.                 break; }
  13.             else if (_X.max_size() <= _X.size())
  14.                 {_St |= ios_base::failbit;
  15.                 break; }
  16.             else
  17.                 _X += _Tr::to_char_type(_C), _Chg = true;
  18.         _CATCH_IO_(_I); }
  19.     if (!_Chg)
  20.         _St |= ios_base::failbit;
  21.     _I.setstate(_St);
  22.     return (_I); }
  23. template<class _E, class _Tr, class _A> inline

Guardar los cambios ya sea en el block de notas solo le das en Guardar o en el Visual.
Y eso es todo, Muchas gracias a los que me ayudaron y espero que a alguien mas le sirva.


Pagina de microsoft donde marcan el error: http://support.microsoft.com/kb/240015

Última edición por jose_desa; 06/04/2010 a las 00:23 Razón: complementar

Etiquetas: c++, getline, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:18.