Si vous voulez étudier cette question, commencez par du texte ASCII brut. Il n'y a qu'un octet par caractère, c'est très simple, et vous pouvez l'ouvrir dans le Bloc-notes ou n'importe lequel de ses remplaçants bien plus performants.
Quant à ce qui se passe réellement lorsqu'un programme lit un fichier... en gros, il s'agit de faire un appel système pour ouvrir le fichier, ce qui vous donne un handle de fichier (juste un numéro que le système d'exploitation associe à un enregistrement dans le système de fichiers). Vous faites ensuite un appel système pour lire des données du fichier, et le système d'exploitation va les chercher sur le disque et les copie dans une région de la RAM que vous spécifiez (ce serait un tableau de caractères/octets dans votre programme). Répétez la lecture si nécessaire. Et lorsque vous avez terminé, vous lancez un autre appel système pour fermer le fichier, ce qui indique simplement au système d'exploitation que vous en avez fini avec lui. La séquence, en pseudo-code C, est donc la suivante
int f = fopen(...);
while (...) {
byte foo[BLOCK_SIZE];
fread(f, foo, BLOCK_SIZE);
do something with foo
}
fclose(f);
Si vous vous intéressez à ce que le système d'exploitation fait réellement en coulisses pour transférer les données du disque à la mémoire vive, eh bien... c'est une toute autre boîte de Pandore ;-)