Este pensamiento proviene de una discusión sobre un problema práctico Reemplazar varias líneas nuevas en un archivo con solo una . Ocurrió algo incorrecto al usar un terminal cygwin que se ejecuta en una máquina con Windows 8.1.
Dado que el terminador de fin de línea sería diferente, como \n , \r o \r\n , ¿es necesario escribir un "portátil" if(c=='\n') para que funcione bien en ¿Linux, Windows y OS X? ¿O la mejor práctica es simplemente convertir el archivo con comandos/herramientas?
#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; }Actualización1:
¿CRT siempre convertirá los finales de línea en '\ n'?
Si un archivo de entrada se abre en modo binario (el carácter 'b' en la cadena de modo), entonces es necesario preocuparse por la posible presencia de '\r' antes '\n' .
Si el archivo no se abre en modo binario (y tampoco se lee usando funciones binarias como fread() ), entonces no es necesario preocuparse por la presencia de '\r' antes '\n' porque eso se manejará antes que el su código recibe la entrada, ya sea mediante una función del sistema relevante (por ejemplo, un controlador de dispositivo que lee la entrada del disco o desde stdin ) o mediante la implementación de las funciones que usa para leer la entrada del archivo.
Si está transfiriendo archivos entre sistemas (por ejemplo, escribiendo el archivo en Linux y transfiriéndolo a un sistema Windows, donde un programa intenta leerlo), entonces tiene opciones;
ftp , esto se puede manejar transfiriendo el archivo usando el modo de texto en lugar del modo binario. Si el archivo se transfiere en modo binario, deberá ejecutar el archivo a través de dos2unix (si transfiere el archivo a unix) o a través de unix2dos (hacia el otro lado).\r\n , suelte el carácter '\r' . Podría decirse que el último es el más robusto: el código de escritura puede incluir \r antes de \n caracteres, o puede que no, pero el código de lectura simplemente ignora cualquier carácter '\r' que encuentre antes de un carácter '\n' . Tal código probablemente incluso funcionará si los archivos se editan a mano (por ejemplo, con un editor de texto, que puede configurarse por separado para insertar o eliminar \r y \n ) antes de leerlos.