Questa riflessione deriva da una discussione su un problema pratico Replacing multiple new lines in a file with just one. Si è verificato qualcosa di sbagliato durante l'utilizzo di un terminale cygwin in esecuzione su un computer Windows 8.1.È necessario scrivere un "portatile" se (c == ' n') per elaborare i file multipiattaforma?
Poiché il terminatore end-of-line sarebbe stato diverso, come \n
, \r
o \r\n
, è necessario scrivere un "portatile" if(c=='\n')
per farlo funzionare bene su Linux, Windows e OS X? Oppure, la best practice è solo per convertire il file con comandi/strumenti?
#include <stdio.h>
int main()
{
FILE * pFile;
int c;
int n = 0;
pFile=fopen ("myfile.txt","r");
if (pFile==NULL) perror ("Error opening file");
else
{
do {
c = fgetc (pFile);
if (c == '\n') n++; // will it work fine under different platform?
} while (c != EOF);
fclose (pFile);
printf ("The file contains %d lines.\n",n);
}
return 0;
}
Update1:
CRT sarà sempre convertire i fine riga in '\ n'?
CRT convertirà sempre le terminazioni di riga in ''\ n'', quindi se leggi il file come testo sarà automaticamente portatile. A meno che non vogliate leggere un file da qualsiasi piattaforma con qualsiasi tipo di fine linea –
@ LưuVĩnhPhúc Grazie.E se stai cercando di leggere un file (che è stato creato su Windows) sotto Linux, la cosa migliore è riscrivere 'if (c == '\ n')', o semplicemente convertire il file con comandi/strumenti? –
@ LưuVĩnhPhúc sbagliato (in generale). Le terminazioni di riga vengono tradotte solo su piattaforme Microsoft, se il file/stream viene aperto in "modalità ASCII" (che solo * esiste * su piattaforme Microsoft) – joop