Entrées/sorties bas niveau

Affichage d'un fichier sur la sortie standard

Voici un programme affichant le contenu d'un fichier sur sa sortie standard :
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

#define TAILLE_TAMPON 4096

int main(int argc, char *argv[])
{
    if (argc < 2) {
        fprintf(stderr, "Usage: %s fichier\n", argv[0]);
        return EXIT_FAILURE;
    }

    const char *nom = argv[1];
    char tampon[TAILLE_TAMPON];
    int fich, nlus, necrits;
    int total = 0;
    fich = open(nom, O_RDONLY);
    if (fich < 0) {
        perror("Ouverture du fichier");
        return EXIT_FAILURE;
    }
    do {
        nlus = read(fich, tampon, TAILLE_TAMPON);
        if (nlus < 0) {
            perror("Erreur de lecture");
            close(fich);
            return EXIT_FAILURE;
        }
        total += nlus;
        necrits = write(1, tampon, nlus);
        if (necrits != nlus)
            fprintf(stderr, "%d caractères écrits au lieu de %d lus\n",
                    necrits, nlus);
    } while (nlus != 0);
    fprintf(stderr, "%d caractères du fichier %s ont été copiés\n",
            total, nom);
    close(fich);
    return EXIT_SUCCESS;
}

Exécutez ce programme en utilisant comme paramètre un fichier texte (le code source par exemple). Pour une seconde exécution utilisez un fichier binaire, mais en redirigeant la sortie standard dans un fichier. Pourquoi faut-il faire cela ? Dans les deux cas vérifiez que le nombre de caractères copiés est correct.

Compléter le programme pour qu'il accepte plusieurs noms de fichiers sur sa ligne de commande.  Il doit alors afficher le contenu de tous les fichiers.

Format binaire

Écrire un programme remplissant un tableau de 100 entiers avec les nombre 0 à 99, tel que l'élément i du tableau contienne la valeur i. Écrire ce tableau dans le fichier /tmp/tab.bin.

Quels paramètres de la commande od(1) utiliser pour visualiser en décimal, en hexadécimal le contenu de ce fichier ?

Copie de fichier

Écrire un programme :

copie source destination

qui copie le fichiers source dans le fichier destination.  Le fichier destination ne doit pas exister et doit être créé avec les droits rw- --- ---.  Le programme doit afficher un message d'erreur si ce n'est pas le cas.

Ajouter au programme une option -f permettant d'écraser le fichier destination si il existe.

Ajouter une autre option -a permettant d'ajouter le contenu du fichier source au fichier destination si celui-ci existe déjà.