Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Greenpeace
Realizzare un simulatore SPICE: versione per MS-DOS a 16 bit (2/5)
Scritto da Massimo Mazza il 26-01-2011 ore 09:27
Intel Cluster Studio XE
La compatibilità tra i mondi MS-DOS/Windows e UNIX, per quanto concerne i file di testo ASCII, è uno dei problemi più noiosi e perditempo, ed è un argomento che i programmatori C di ambedue i mondi imparano a conoscere quasi subito. E' interessante approfondire i motivi, storici e tecnici, di tale incompatibilità. Nel mondo MS-DOS (quindi anche in CP/M e Windows), nei classici file di testo ASCII ogni ritorno a capo è contraddistinto dalla coppia di caratteri carriage return/line feed (CR/LF). Nel linguaggio C tali caratteri sono identificati dalle sequenze di escape "\r" e "\n".

Il linguaggio C nacque in ambiente UNIX, e in tale sistema il terminatore di riga è identificato dal solo carattere LF (line feed), probabilmente per un semplice motivo: risparmiare un carattere (il carriage return appunto). Di fatto, generalmente il sistema operativo effettua una traduzione quando lo stream di testo deve essere inviato a un terminale, video o stampante che sia, convertendo il singolo LF nella coppia CR/LF.

Nel linguaggio C il carattere di escape 'n' che significa newline assume un differente significato, a seconda che lo stream di dati da leggere (o da scrivere) su disco sia testo ASCII o binario. Nel primo caso, che è quello che a noi più interessa, esso viene tradotto in maniera trasparente all'operatore nella sequenza di ritorno a capo, utilizzata da quel particolare sistema operativo: una coppia CR/LF per MS-DOS e Windows, il semplice carattere LF per UNIX.

E' notorio che il classico programma in C, che segue, produce lo stesso output sotto UNIX e sotto Windows. Viene scritta a video la stringa Hello World!, il cursore avanza di una riga e ritorna a capo, scrive la seconda riga, indi ritorna nuovamente a capo e avanza di un'altra riga.
  1. main()
  2. {
  3. 	printf(%s,"Hello world\n");
  4. 	printf(%s,"Hello world\n");
  5. }
Ma se proviamo a scrivere le stesse banali righe di testo su un file:
  1. main()
  2. {
  3. 	// ....
  4. 	fprintf(outfile,%s,"Hello world\n");
  5. 	fprintf(outfile,%s,"Hello world\n");
  6. 	// ....
  7. }
otterremo risultati differenti a seconda che il programma venga eseguito sotto Windows o sotto UNIX. Esaminando il file ottenuto con un editor binario o esadecimale, noteremo che nel primo caso le righe terminano con la sequenza 0D0A esadecimale (la coppia CR/LF appunto). Nel secondo caso terminano con 0A solamente.

Supponiamo ora di copiare il file di testo generato nel secondo caso, in UNIX, portandolo così com'è su una macchina Windows. In tale ambiente, la maggioranza dei programmi si basa, per separare le varie righe di testo, sulla presenza della coppia CR/LF alla fine di ogni riga. Se è presente solamente il carattere di LF si possono ottenere risultati imprevisti. Ad esempio, se il testo viene inviato tale e quale direttamente a una stampante o a video, è molto facile che si ottenga l'output seguente:
  1. hello
  2.      hello
Dopo ogni riga, il cursore (o la testina di stampa) avanza di una riga, ma non effettua il ritorno a capo.
Precedente: MOST150, nuove possibilità di infotainment
Successiva: E' confermato il traffico fantasma di Windows Phone 7
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.281 secondi.