Función de lectura en lenguaje C

read llama internamente a _read, y el valor de retorno de _read se describe en msdn de la siguiente manera

_read devuelve el número de bytes leídos, que puede ser menor que el recuento si hay menos de cuente los bytes que quedan en el archivo o si el archivo se abrió en modo texto, en cuyo caso cada par de retorno de carro y avance de línea (CR-LF) se reemplaza con un único carácter de avance de línea. Solo el carácter de avance de línea se cuenta en el valor de retorno. El reemplazo no afecta el puntero del archivo.

Tenga en cuenta este párrafo: en cuyo caso cada par de retorno de carro y avance de línea (CR-LF) se reemplaza con un único carácter de avance de línea

. Es decir, si el archivo se abre en modo texto, puede haber dos caracteres en el texto cuando el archivo es de nueva línea: nueva línea y sangría (CR-LF), y el sistema lo trata como un símbolo de retorno de carro al regresar ( '\n'). Entonces causará esta situación