Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 10 Octubre 2017, 18:29 pm



Título: (Consulta) Error muy extraño con la salida a consola en C++
Publicado por: class_OpenGL en 10 Octubre 2017, 18:29 pm
Hola, muy buenas. Estoy desarrollando para la facultad una clase llamada Cronologia y otra como FechaHistorica, y tengo problemas con la salida del FechaHistorica. En esta clase, he definido una sobrecarga de operador amigo así:

Código
  1. std::ostream& operator<<(std::ostream &os, const FechaHistorica &fecha) {
  2.    // PRUEBAS
  3.    for(int i = 0; i < (int)fecha.acontecimientos.size(); i++)
  4.        os << fecha.acontecimientos[i] << std::endl;
  5.  
  6.    os << "________________________________" << std::endl;
  7.  
  8.    for(int i = 0; i < (int)fecha.acontecimientos.size(); i++) {
  9.        for(int j = 0; j < (int)fecha.acontecimientos[i].size(); j++)
  10.            os << '(' <<(int)fecha.acontecimientos[i][j] << ',' << fecha.acontecimientos[i][j] << ") ";
  11.  
  12.        os << std::endl << "___" << std::endl;
  13.    }
  14.  
  15.    // CÓDIGO REAL
  16.    os << fecha.año;
  17.  
  18.    for(const std::string &elemento : fecha.acontecimientos)
  19.        os << FechaHistorica::TERMINADOR << elemento;
  20.  
  21.    return os;
  22. }

La parte etiquetada como 'PRUEBAS' significa que no pertenece al código final. FechaHistorica tiene un año (int) y un conjunto de acontecimientos (std::vector de std::string). Pues bien, cuando yo ejecuto ese operador obtengo la siguiente salida:

Citar
Apriori algorithm developed by Rakesh Agrawal and Ramakrishnan Srikant
Nada en especial
Algo
________________________________
(65,A) (112,p) (114,r) (105,i) (111,o) (114,r) (105,i) (32, ) (97,a) (108,l) (103,g) (111,o) (114,r) (105,i) (116,t) (104,h) (109,m) (32, ) (100,d) (101,e) (118,v) (101,e) (108,l) (111,o) (112,p) (101,e) (100,d) (32, ) (98,b) (121,y) (32, ) (82,R) (97,a) (107,k) (101,e) (115,s) (104,h) (32, ) (65,A) (103,g) (114,r) (97,a) (119,w) (97,a) (108,l) (32, ) (97,a) (110,n) (100,d) (32, ) (82,R) (97,a) (109,m) (97,a) (107,k) (114,r) (105,i) (115,s) (104,)  (110,n) (97,a) (110,n) (32, ) (83,S) (114,r) (105,i) (107,k) (97,a) (110,n) (116,t) (13,
___
(78,N) (97,a) (100,d) (97,a) (32, ) (101,e) (110,n) (32, ) (101,e) (115,s) (112,p) (101,e) (99,c) (105,i) (97,a) (108,l)
___
(65,A) (108,l) (103,g) (111,o)
___
#Nada en especial#Algo developed by Rakesh Agrawal and Ramakrishnan Srikant

Como podeis ver, el vector de string contiene los string
  • Apriori algorithm developed by Rakesh Agrawal and Ramakrishnan Srikant
  • Nada en especial
  • Algo

Después he impreso el valor numérico de cada carácter.

El ERROR está en la siguiente parte:
Citar
#Nada en especial#Algo developed by Rakesh Agrawal and Ramakrishnan Srikant

En el código, tengo que se imprima primero el año, y luego el conjunto de sucesos, pero por alguna razón, parece ser que la posición del cursor (columna) vuelve a 0, y sobreescribe los datos de la línea ya impresos. Espero haberme explicado bien.

He probado en cada iteración a hacer un flush de 'os', pero no ha resultado.

Muchas gracias!


Título: Re: (Consulta) Error muy extraño con la salida a consola en C++
Publicado por: class_OpenGL en 10 Octubre 2017, 19:31 pm
Mira que imprimí los caracteres por si había alguno raro... No me fijé en el carriage character. Es muy raro, los datos se han leído usando la clase std::ifstream, ¿no debería saltarse estos caracteres cuando se lee sin activar la lectura binaria?

Muchas gracias


Título: Re: (Consulta) Error muy extraño con la salida a consola en C++
Publicado por: class_OpenGL en 10 Octubre 2017, 19:36 pm
Vaaaale. Ya entiendo!!!!!! std::getline no se salta los retornos de carro... Pues no tenía ni idea!!

Muchas gracias por pasaros!