2012-04-27 17 views
20

Capisco che QString::split debba essere utilizzato per ottenere un QStringList da un file multilinea QString. Ma se ho un file e non so se proviene da Mac, Windows o Unix, non sono sicuro che l'QString.split("\n") funzionerebbe bene in tutti i casi. Qual è il modo migliore per gestire questa situazione?QString :: split() e " r", " n" e " r n" convenzione

risposta

34

Si può provare:

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

Questo divide la stringa ogni volta che uno del carattere di fine riga (o avanzamento riga o ritorno a capo) viene trovato.

+3

Penso che tu abbia perso alcuni punti. Vedi la mia risposta. –

21

Emanuele Bezzi's answer manca un paio di punti.

Nella maggior parte dei casi, una stringa letta da un file di testo sarà stata letta utilizzando un flusso di testo, che converte automaticamente la rappresentazione di fine linea del sistema operativo in un singolo carattere '\n'. Quindi, se hai a che fare con file di testo nativi, l''\n' dovrebbe essere l'unico delimitatore di cui ti devi preoccupare. Ad esempio, se il programma è in esecuzione su un sistema Windows, leggendo l'input in modalità testo, le terminazioni di linea saranno contrassegnate con nella memoria con singoli caratteri \n; non vedrai mai le coppie "\r\n" esistenti nel file.

Ma a volte è necessario occuparsi di file di testo "stranieri".

Idealmente, dovresti probabilmente tradurre questi file nel formato locale prima di leggerli, il che evita il problema. Solo l'utilità di traduzione deve essere a conoscenza delle terminazioni di linee varianti; tutto il resto si occupa solo di testo.

Ma questo non è sempre possibile; a volte si potrebbe desiderare che il programma gestisca i file di testo di Windows quando è in esecuzione su un sistema POSIX (Linux, UNIX, ecc.) o viceversa.

Un file di testo in formato Windows su un sistema POSIX avrà un carattere '\r' in più alla fine di ogni riga.

Un file di testo in formato POSIX su un sistema Windows apparirà costituito da una linea molto lunga con caratteri incorporati '\n'.

L'approccio più generale è leggere il file in modalità binaria e gestire esplicitamente le terminazioni di riga.

io non sono a conoscenza QString.split, ma ho il sospetto che questo:

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

ignorerà le linee vuote, che appariranno sia come "\n\n" o come "\r\n\r\n", a seconda del formato. Le linee vuote sono dati di testo perfettamente validi; non dovresti ignorarli se non sei certo che abbia senso farlo.

Se è necessario affrontare con l'input di testo delimitato sia da "\n", "\r\n" o "\r", allora penso che qualcosa di simile:

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

sarebbe fare il lavoro. (Grazie al commento di parsley72 per avermi aiutato con la sintassi delle espressioni regolari.)

Un altro punto: probabilmente non è probabile che incontriate file di testo che usano solo '\r' per delimitare le linee. Questo è il formato utilizzato da MacOS fino alla versione 9. MaxOS X è basato su UNIX e utilizza terminazioni di linea standard in stile UNIX '\n' (anche se probabilmente tollera anche le terminazioni di riga '\r').

+0

TIL che Mac OS X non usa più '\ r', grazie. – sashoalm

+1

'|' non richiede un carattere di escape, ma sfortunatamente quel cambiamento è troppo piccolo per essere modificato! – parsley72

+0

@ parsley72: Grazie, risolto. Alcune sintassi di rexexp usano '\ |'; QRegEx non lo fa, ma anche se facesse il '\' dovrebbe essere sfuggito nella stringa letterale, quindi ho sbagliato in entrambi i modi. –

Problemi correlati