• [^] # Re: En C

    Posté par . En réponse au message taille du "fichier" /proc/meminfo. Évalué à 2. Dernière modification le 17 août 2015 à 20:14.

    Je m'auto-réponds pour préciser encore une chose.

    J'utilise %d pour obtenir la valeur mais comme le montre Benoît Sibaud plus haut, il faut lire un long unsigned au lieu d'un simple int.

    Puisque je renvois -1 pour signaler la non-éxistence d'une clé je dois en fait retourner un long long unsigned. Seulement long long unsigned n'est pas possible en C89 et donc il faut trouver un autre moyen.

    Ici j'utilise une structure pour stocker le résultat.

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    struct meminfo_entry {
     char key[32];
     long unsigned value;
    };
    static int meminfo(char *key, struct meminfo_entry *entry)
    {
     FILE *file;
     file = fopen("/proc/meminfo", "r");
     while (fscanf(file, " %31[^:]: %lu%*[^\n]\n",
     entry->key, &entry->value) == 2) {
     if (!strcmp(entry->key, key))
     return fclose(file), 1;
     }
     return fclose(file), 0;
    }
    int main(void)
    {
     struct meminfo_entry entry;
     if (meminfo("HugePages_Free", &entry))
     printf("meminfo(%s) = %lu\n", entry.key, entry.value);
     if (meminfo("VmallocTotal", &entry))
     printf("meminfo(%s) = %lu\n", entry.key, entry.value);
     if (!meminfo("Invalid_Key", &entry))
     printf("\"Invalid_Key\" doesn't exist\n");
     return EXIT_SUCCESS;
    }

    Et une dernière pour la route :

    fscanf("%*[^\n]\n") ne marche dans le cas ou il reste juste \n, car %*[^\n] vas échouer et donc le \n restant ne sera pas vidé. L'astuce ici consiste à mettre un espace devant le premier spécificateur de conversion: " %31[^:]: %lu%*[^\n]", de cette manière tout les espaces, saut de lignes et autre tabulations sont passé.

    On peut cependant laisser le \n restant pour bien montrer ce que l'on souhaite faire : aller à la ligne suivante.