Archivos txt se deforman cuando paso de linux a windows

Iniciado por Aikanáro Anário, 26 Octubre 2011, 19:06 PM

0 Miembros y 1 Visitante están viendo este tema.

Aikanáro Anário

Tengo una "sopa de letras" en un archivo sopa.txt y tengo un programa en java que busca palabras en la sopa, cuando encuentra una palabra, modifica otro archivo llamado asopao.txt poniendo la palabra que encontró entre corchetes, pero bueno, eso no es lo importante. Lo que pasa es que si paso los archivos incluyendo los txt a windows, cuando los abro se eliminaron todos los saltos de línea, y el archivo aparece en una sola línea.

Si este es el archivo

A P G S E A
A D A E T S
P O T O L N
Y U O K N H


cuando lo paso a windows queda así:

A P G S E AA D A E T SP O T O L NY U O K N H


Y por lo tanto el programa no funciona. Eso pasa con todos los archivo txt.
Lo que faltaba en internet: http://binar10s.blogspot.com/

brians444

Debes convertir el "\n", ya que no es igual en linux que en windows (si siempre windows dando la nota). En linux se utiliza LF mientras que el w$ CR/LF ..

Una forma facil de convertirlo es utilizar Geany un IDE para Linux, en este vas a "Documento->Establecer fin de linea" y eliges convertirlo al formato que desees.

Espero haber solucionado tu problema

Saludos  :D
Debian user :)
C/C++ Programmer

Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera todavia no estoy totalmente seguro.

el-brujo

Si abres los txt con el Wordpad no te pasará, pero si con el bloc de notas, que es lo que comenta brians444  del LF y CR+LF

Citar
Java también proporciona las secuencias de escape \n y \r, que sí que garantizan que su valor será 0x0A y 0x0D respectivamente. Para que un programa hecho en Java se vea correctamente en el notepad, es necesario poner \r\n. Esto cobra vital importancia si se trata de comunicar nuestro programa en Java con un programa hecho en C mediando un archivo txt.

beholdthe

Cita de: el-brujo en 26 Octubre 2011, 20:04 PM
Si abres los txt con el Wordpad no te pasará, pero si con el bloc de notas, que es lo que comenta brians444  del LF y CR+LF

Gracias por el consejo

Aikanáro Anário

Bueno, no he entendido muy bien todavía...

Sé que el caracter de escape \n es un salto de línea, pero eso debo de escribirlo en el programa o en el archivo. Porque ya de antemano los archivo están creados, entonces no sé si simplemente abriendo el txt y poníendoles el \n funcionará o ese caracter de escape solo funciona cuando es interpretado y traducido por un compilador.

En caso de que lo vaya a hacer manual, debo hacerlo antes de pasarlo a windows, después o no importa?
Si estando en linux al archivo le pongo CR/LF ¿ se ve mal? y viceversa?

También tengo el mismo problema con los acentos en las impresiones por consola o en los comentarios ¿debería poner el caracter asccii correspondiente al acento? es muy tedioso hacerlo así...
Lo que faltaba en internet: http://binar10s.blogspot.com/

WHK

#5
LF o mas conocido como el \x0a y \n es un salto de linea universal.

Ahora, windows le agregó algo más y le puso CR o mas conocido como el \x0d o \r que significa retorno de carro.

Es como si en una maquina de escribir le dijeras que corra una linea hacia abajo y ahora corras el carro hasta el principio de la hoja, pero en algunas ocasiones eso es realmente inservible porque en un computador no usas carros jajajajajajjajaja


pero en fin, creo que en mac tienen otro tipo de salto de linea también, de hecho si usas saltos de linea en windows con worpad y despues lo pasas a linux lo vas a ver así:

CitarA P G S E A

A D A E T S

P O T O L N

Y U O K N H

No se si alguna ves has subido un archivo hecho desde windows a un servidor con linux y luego tratas de editarlo ahi, podrás ver que hay dos saltos de linea por cáda linea de código y es una porquería. Por eso prefiero configurar mi editor de texto a saltos de linea para linux por defecto.

En todo lo que sea servicio web, ssh, telnet, ftp, etc etc basta con enviar saltos de linea con \n porque ningún programa va a tomar en cuenta tu \r.

Ahora, como lo hago para ubicar lineas en los archivos?

Normalmente en un programa podría decirse esto:
separado = split("\n", texto)
el problema viene cuando el texto contiene \n\r ya que las lineas de texto te van a quedar con el carácter \r al comienzo y si dices:
separado = split("\n\r", texto)
y el archivo no contiene \r entonces vas a tener problemas porque te dirá que no hay lineas.

Por esto intento usar functiones nativas depndiendo de cáda lenguaje, por ejemplo en php digo:
$separado = explode('<br />', nl2br($texto));
porque nl2br() me transforma automáticamente los saltos de linea a <br /> y lo calcula solito comparando multiples formas de saltos de linea, en .net digo:
var separado as array() = texto.readlline()
pero en c++ y otros lenguajes de mas bajo nivel es un quebradero de cabeza x__x

Dale un vistazo a esto:
http://es.wikipedia.org/wiki/Nueva_l%C3%ADnea

CitarLa secuencia CR LF era común en los primeros ordenadores que tenían máquinas de teletipo (como el ASR33) como dispositivo de terminal. Esta secuencia era necesaria para posicionar el cabezal de la impresora al principio de una nueva línea. Como esta operación no se podía hacer en tiempo "1 carácter", había que dividirla en dos caracteres. A veces era necesario enviar CR LF NUL (siendo NUL el carácter de control que le manda "no hacer nada"), para asegurarse de que el cabezal de impresión parara de moverse. Después de que estos sistemas mecánicos desaparecieran, la secuencia CR LF dejó de tener sentido, pero aun así se ha seguido usando.

Se especula que QDOS (que Microsoft compró y renombró a MS-DOS) adoptó CRLF para copiar la implementación usada por CP/M. También se dice que CP/M eligió CR+LF para introducir una clara incompatibilidad con Unix, y así intentar evitar una posible denuncia de AT&T/Bell, que decía que CP/M violaba el copyright de Unix porque estaba basado en Unix (según esta teoría). Otros creen que CP/M se parece más a los sistemas de DEC (como el RSTS/E) que a Unix. En cualquier caso, esta convención de QDOS pasó al siguiente sistema operativo comercializado por Microsoft, el Windows, y sigue igual en la actualidad (2006).

O sea que podemos decir que a causa del copyright de unix windows no pudo utilizar \n como final de linea y estubo obligado a usar \n\r xD