2011-02-09 7 views
6

Come tutti sappiamo in Windows EOL è CRLF e in linux LF e CR in Mac. (more_info)Come si legge Linux o Mac creato file in Windows tramite C FILE *?

Voglio scrivere un programma che legge sia linux sia Mac. Win file riga per riga in Windows. Per aprire il file userei fopen in modalità "rt", ma non so come leggere le righe. Fgets legge fino a CRLF e LF sotto Windows ma voglio che funzioni anche per EOL = CR.

Quindi qual è la soluzione? Grazie in anticipo.

+5

Linux utilizza LF non CR. MacOS9 usato CR semplice. –

+0

Sì, hai ragione PiotrLegnica http://mc-computing.com/languages/CR_LF.htm questa è l'intera lista. –

+3

@Mihran: MacOSX usa LF. –

risposta

1

Quindi non ho trovato nulla di buono per me e ho deciso di scrivere la mia funzione my_fgets che utilizza fgetc nel corpo.

1

Finché si apre il file in modalità rt (lettura - testo), si dovrebbe andare bene. fgets() restituirà una riga e gestirà le sottili differenze tra le piattaforme. Quando scrivi su un file, usa '\ n' come EOL e otterrai i finali di linea corretti per la tua piattaforma. Questa è la ragione per aprire il file in modalità testo. Se usi la modalità binaria, dovrai gestire tutte le diverse terminazioni di linea nel tuo software.

+0

Sto ricevendo il file tramite il mio programma client in Windows dal server Linux. Ecco perché nella maggior parte dei casi i file da cui leggerò hanno il formato EOL di Linux. –

+0

@Mihran: non importa, la differenza sarà gestita per te dagli stream, quindi non preoccuparti ... a meno che tu non voglia scrivere file con Linux line endings da Windows :) –

+0

Ho provato. Non funziona :(LF e CRLF funzionano in Windows, ma non in CR. Non averlo provato su Mac e Linux, ma assicuratevi che tutto vada bene –

2

Per aprire in modalità "t", il file deve essere conforme alla piattaforma su cui si sta eseguendo. Altrimenti, devi solo aprire in modalità binaria e ordinare la differenza da solo.

La libreria C consente di scrivere un programma che funziona grosso modo lo stesso su piattaforme diverse, ma non supporta la "lettura incrociata" dei file.

Problemi correlati