2012-04-27 14 views
20

Entiendo que QString::split se debe utilizar para obtener QStringList de una línea múltiple QString. Pero si tengo un archivo y no sé si proviene de Mac, Windows o Unix, no estoy seguro de si QString.split("\n") funcionaría bien en todos los casos. ¿Cuál es la mejor manera de manejar esta situación?QString :: split() y " r", " n" y " r n" convención

Respuesta

34

Usted puede tratar de:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); 

Esto divide la cadena cada vez que se detecta cualquiera de los carácter de nueva línea (ya sea línea de alimentación o retorno de carro).

+3

Creo que te perdiste algunos puntos. Ver mi respuesta –

21

Emanuele Bezzi's answer echa en falta un par de puntos.

En la mayoría de los casos, una cadena de lectura de un archivo de texto se habrá leído utilizando una secuencia de texto, que traduce automáticamente la representación de fin de línea del sistema operativo a un solo carácter '\n'. Por lo tanto, si está tratando con archivos de texto nativos, '\n' debe ser el único delimitador del que debe preocuparse. Por ejemplo, si su programa se ejecuta en un sistema Windows, leyendo entradas en modo texto, las terminaciones de línea se marcarán como en la memoria con \n caracteres únicos; nunca verá los pares "\r\n" que existen en el archivo.

Pero a veces es necesario tratar con archivos de texto "extranjeros".

Idealmente, probablemente debería traducir cualquiera de estos archivos al formato local antes de leerlos, lo que evita el problema. Solo la utilidad de traducción debe conocer las terminaciones de línea variantes; todo lo demás solo trata de texto.

Pero eso no siempre es posible; a veces puede querer que su programa maneje archivos de texto de Windows cuando se ejecuta en un sistema POSIX (Linux, UNIX, etc.) o viceversa.

Un archivo de texto con formato de Windows en un sistema POSIX parecerá tener un carácter adicional '\r' al final de cada línea.

Un archivo de texto con formato POSIX en un sistema Windows aparecerá como una línea muy larga con caracteres incrustados '\n'.

El enfoque más general es leer el archivo en modo binario y tratar las terminaciones de línea de forma explícita.

no estoy familiarizado con QString.split, pero sospecho que esto:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); 

ignorarán las líneas vacías, que aparecerán ya sea como "\n\n" o como "\r\n\r\n", dependiendo del formato. Las líneas vacías son datos de texto perfectamente válidos; no debes ignorarlos a menos que estés seguro de que tiene sentido hacerlo.

Si tiene que lidiar con la entrada de texto delimitado ya sea por "\n", "\r\n" o "\r", entonces creo que algo como esto:

QString.split(QRegExp("\n|\r\n|\r")); 

haría el trabajo. (Gracias al comentario de parsley72 por ayudarme con la sintaxis de expresiones regulares.)

Otro punto: probablemente no encuentre archivos de texto que usen solo '\r' para delimitar líneas. Ese es el formato utilizado por MacOS hasta la versión 9. MaxOS X se basa en UNIX, y usa terminaciones de línea estándar de estilo UNIX '\n' (aunque probablemente también tolera los finales de línea '\r').

+0

TIL que Mac OS X ya no usa '\ r', gracias. – sashoalm

+1

'|' no requiere un carácter de escape, pero lamentablemente ese cambio es demasiado pequeño para que pueda editarlo. – parsley72

+0

@ parsley72: Gracias, corregido. Algunas sintaxis de rexexp usan '\ |'; QRegExp no lo hace, pero incluso si lo hiciera, el '\' tendría que ser escapado en el literal de la cadena, así que estaba equivocado de cualquier manera. –

Cuestiones relacionadas