Remplacer une ligne dans un fichier txt

Fermé
Snykeur - Modifié par mamiemando le 15/12/2016 à 11:09
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 15 déc. 2016 à 11:15
Bonjour,

J'ai un fichier .txt qui stock les données de joueurs sous la forme : pseudo ligne colonne points
Par exemple :
SNYKEUR 12 40 100
MARC 2 16 55
...
Et j'aimerais modifier les valeurs des lignes, colonnes et points directement dans le fichier txt. J'ai donc pensé à faire une boucle qui va parcourir le fichier jusqu'à trouvé le pseudo voulu et je stock la position du pseudo dans une variable de type entier, ensuite je me positionne dans le fichier avec un fseek() à partir du début du fichier jusqu'à la position que j'ai stocké précédemment et pour finalement faire un fprint() pour écraser l'ancienne ligne et la remplacer par la nouvelle avec les nouvelles valeur dedans. Mais le problème c'est que le pseudo s'ajoute au début du fichier écrasant ainsi la 1ère ligne qui n'était pas l'endroit où se trouvait le pseudo et n'écrase pas totalement la ligne ce qu'il fait que le résultat est une fusion entre les deux pseudo et les valeurs ligne, colonne et points ne sont pas bien recopiées.

En gros si je veux mettre à jour les données du pseudo MARC je vais avoir comme résultat :
SNMARC 2 1 55
RC 2 16 55
Enfin bref ça fait n'importe quoi dans le fichier et j'aimerais comprendre pourquoi...
Pour info j'ouvre le fichier en mode r+.
Merci d'avance pour vos réponses !

PS : Voici le code qui pose problème :

int ligne, colonne, points;
int positionFile=1;
char pseudo[10];
char lignePseudo[100];
FILE *listeJ = NULL;

listeJ = fopen("listeJ.txt","a+");
while(fgets(lignePseudo, sizeof(lignePseudo), listeJ) != NULL)
{
     if(strstr(lignePseudo, pseudo) != NULL)
          break;
     else
          memset(lignePseudo,0, sizeof(lignePseudo));
     positionFile++;
}
fclose(listeJ);

listeJ = fopen("listeJ.txt", "r+");

if(listeJ != NULL)
{
    fseek(listeJ, positionFile, SEEK_SET);
    fprintf(listeJ, " ");
    fprintf(listeJ, "%s %d %d %d\n",pseudo, ligne, colonne, points);
}

fclose(listeJ);


A voir également:

1 réponse

mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
Modifié par mamiemando le 15/12/2016 à 11:15
Bonjour,

As-tu regardé ce que les gens proposaient sur Internet, par exemple :
https://www.sanfoundry.com/c-program-replace-line-text-file/

Ceci dit comme souligné ici, je ne pense pas que le c soit un langage adapté pour ce genre de manipulation,
sed
ou
awk
sera plus simple à utiliser par exemple :
https://stackoverflow.com/questions/7736322/replace-line-in-text-file-using-c

(même si je ne suis pas d'accord avec la première phrase apportée dans la réponse apportée sur stackoverflow)

Bonne chance
0