C modifier fichier de conf

a marqué ce sujet comme résolu.

Bonjour, je bloque sur un problème, j’ai un fichier texte de cette forme :

1
2
3
4
5
6
7
[part1]
Minimum Read Request=45 //45 auto, 128 conf1
Maximum Read Request=162

[part2]
core_min=1
core_max=32 //max core of motherboard

j’aimerais en C (sous linux) modifier par exemple "Maximum Read Request=162" par "Maximum Read Request=240"

voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    FILE *file2 = fopen ("config.conf", "r"); //open slurm node feature_plugin config file

    if (file2 != NULL) { 
            const size_t line_size = 300;
            char* line = malloc(line_size);
            while (fgets(line, line_size, file2) != NULL)  {

                    if (NULL == (equal = strchr(copy, '='))) {
                    } else {

                    // comment on remplace ma ligne

                    }

            }
    }

    pclose(file2);

Salut,

C’est pas très facile à faire en C sans bibliothèque spécialisée. Le plus simple est d’analyser tout le fichier pour en extraire les données et faire en sorte qu’elles soient facilement manipulables, de remplacer la valeur de Maximum Read Request, de tout resérialiser dans ton espèce de format INI initial et d’écrire tout ça dans le fichier, en remplaçant tout. Bref, c’est quand-même casse pieds, et de mémoire tu risque d’avoir encore plus de problèmes si tu essaye de ne réécrire vraiment qu’une seule ligne.

En gros, tu as deux possibilités :

  • Faire ce que je viens de dire en utilisant une biblothèque externe pour parser ton format de fichier.

  • Remplacer juste la ligne en mode vite-fait-mal-fait avec une regexp. Ça se fait super facilement avec sed sous Linux, pas besoin de faire un programme en C pour ça.

+1 -0

Salut,

Il y a plusieurs façons de faire (et ça m’a l’air délicat). Ce que je ferais, c’est : charger le fichier ne mémoire dans un buffer, remplacer 162 par 240 et réécrire le buffer dans le fichier. C’est peut-être bourrin, il y a peut-être plus élégant, mais ça aurait le mérite de fonctionner.

Ca sera juste chiant lorsque tu voudras mettre une valeur qui prend plus d’octets ascii que "240". Si tu veux mettre "9999" par exemple, tu auras besoin d’avoir un buffer plus grand et de décaler tous les caractères qui se trouvent après ton nombre. Ah, le C…

Bref, dans ton cas précis, un mmap est sans doute ce qu’il te faut si tu ne veux pas te casser la tête : https://linux.die.net/man/2/mmap

J’essaie de te faire un PoC dès que j’ai + de temps, à moins qu’un co-zesteur/une co-zesteuse s’en occupe à ma place.

Bonne chance !

Ton fichier semble suivre le format INI.

Le plus simple, c’est d’utiliser une bibliothèque pour ça.


Bon sinon, pour ton problème. Ben, il faut écrire. Là, tu ne fais que lire (d’ailleurs tu ouvres ton fichier en mode lecture, ce qui n’autorise pas d’écriture dans ce fichier).

Le plus propre, c’est d’écrire dans un fichier temporaire. Puis ensuite, d’écraser le premier fichier.

Les étapes :

1
2
3
Lecture ligne par ligne du fichier INI
   À chaque ligne, on écrit cette ligne modifiée ou non dans un fichier temporaire.
Quand on a tout lut et tout écrit, on remplace le fichier INI par le fichier temporaire
  • La lecture se fait par fopen avec l’option "r" comme tu fais.
  • La création d’un fichier temporaire, c’est un peu comme tu veux. Il existe bien la fonction "tmpfile" qui te retourne un descripteur de fichier vers un fichier temporaire. Ou alors tu as la fonction tmpnam, qui te retourne un nom de fichier temporaire.
  • En fonction de la méthode choisie, tu peux soit revenir au début du fichier avec rewind() puis lire le fichier temporaire et écrire chaque ligne dans le fichier INI en l’écrasant (option d’ouverture "w"). Soit tu as déjà un fichier temporaire créer avec "tmpnam" et du coup, tu peux faire un rename pour écraser l’ancien fichier.

Voilà, voila …


Sans vouloir troller, j’adore le C, mais en pratique, j’aurais utiliser Python pour un truc comme ça.

+2 -2

arf je m’attendais a une réponse du style "y’a plus simple comme solution", bon du coup c’est bien plus compliqué que prévue.

Y’aurais t’il une petite lib en C capable de faire cela ? j’ai chercher mais je n’en trouve pas… pour les lire y’en a a la pelle mais pour les éditer…

arf je m’attendais a une réponse du style "y’a plus simple comme solution", bon du coup c’est bien plus compliqué que prévue.

1
$ sed 's/\(Maximum Read Request *= *\)[[:digit:]]*/\1240/' ton_fichier.ini

(Mais c’est pas du C :) )

+1 -0

Salut,

Le C est un langage bas niveau et certains mécanismes simples ne sont donc pas cachés.

Surtout, dans un cas d’utilisation normal, on utiliserait une structure pour stocker l’ensemble des options de configuration. Qu’on lirait cette configuration depuis le fichier "conf.ini" avec iniparser par exemple. Puis qu’on écraserait le fichier de conf (dans un cas normal on a rarement besoin d’écraser un fichier de configuration … Mais admettons) en réécrivant depuis la structure.

Voila, tu as vraiment tous les outils pour faire ce que tu veux (entendons nous bien, que tu veuilles ou que ce soit un travail d’école, ne nous regarde pas) faire.

Si tu trouves que c’est encore trop compliqué, je t’invite à utiliser un autre langage de programmation comme Python, bash, … Je t’invite également à me remettre -1 au passage, ça fait toujours plaisir. ;)

Bonne journée.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte