2011-08-10 42 views
5

He compilado en Ubuntu un programa que fue desarrollado para (y funciona en) Windows. En Ubuntu, veo este código:comportamiento cout extraño

string s = values_[9]; 
cout << s << endl; 
cout << s << "x\n"; 

producir este resultado:

high 
xigh 

El resultado esperado para la segunda línea es "highx". Sé que el valor de values_ [9] se lee originalmente de un archivo (escrito en Windows). La impresión de otras cadenas parece funcionar normalmente.

¿Qué está pasando aquí?

+2

lo que es valores? – Itsik

Respuesta

8

Ejecute el comando con su salida canalizada a través de cat -A. Probablemente, ya sea el valor s, o la salida producida por endl, le está dando un carácter '\r', que normalmente envía el cursor al principio de la línea.

EDITAR: Pensándolo bien, el '\r' vagabundo es casi seguro en s, no en la salida producida por endl. Pensé que podría haber algunas cosas locas divertidas sucediendo, pero tener s igual a "high\r" explica los síntomas.

Edit2: Si el sistema no tiene cat -A (que es una extensión de GNU), trate cat -v o, si estás desesperado, od -c.

+0

+1 (agrega "Pero no en Windows, de ahí las observaciones dispares.") –

+0

En realidad, '\ r'' envía el cursor al principio de la línea en Windows (dependiendo de dónde lo escribes, supongo, pero funciona de esa manera en una ventana 'cmd'). La diferencia es que Windows usa '"\ r \ n"' como un terminador de línea en archivos de texto, mientras que Unix usa '" \ n "'. El software de buen comportamiento probablemente no producirá caracteres aislados '' \ r'' en ninguno de los sistemas. –

+0

OK, pero de acuerdo con la salida hay _is_ un '\ r' aislado (de lo contrario, la 'x' estaría en su propia línea). –

3

Lo que probablemente está sucediendo es que hay \r en values_[9].

4

La cadena que está imprimiendo tiene un retorno de carro '\r' en ella. Lo que está sucediendo es que está imprimiendo high, luego el retorno de carro, que coloca el cursor nuevamente en el inicio de la línea. Luego, cuando imprime el x, sobrescribe la primera letra de la línea.

Usted debe eliminar ya sea el retorno de carro del archivo de origen (por ejemplo, con dos2unix(1) o muchas otras opciones), o cambiar su código para pelar el retorno de carro después de leer el archivo.