Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplacer un caractère dans un fichier texte

Sujet résolu
13 janvier 2021 à 16:57:10

Bonjour, pour mon premier projet C je dois créer un solitaire en console.

J'ai donc choisis de faire un plateau de jeu en txt.

Mais dans mon algorithme je dois modifier un caractère du fichier texte en le parcourant, remplacer un "0" par un "*", voici le code que j'ai fais :

    FILE* fichier = NULL;
    fichier = fopen("plateau.txt", "r+");
    int formule =(13+10*y+x+y+1);
    printf("%d",formule);
    while (stop != 1)
    {
        current_char  = fgetc(fichier);
        pos = ftell(fichier);
        if(pos==formule)
        {
            fputc(fichier, "*");
            stop = 1;
        }
    }
    fclose(fichier);
    printf("Plateau mis a jour");

La formule donne l'endroit ou se trouve le caractère a remplacer, et si la position du curseur et la meme que celui calculé par la formule alors on remplace le caractère

Mais le problème rien ne se passe, on rentre bien dans le if(pos==formule) mais aucun changement de le fichier texte.

Des idées? Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2021 à 17:16:26

Hello,

Je n'ai pas cherché à comprendre ton programme, mais ligne 11 c'est '*' et pas "*" : fputc() écrit un caractère, pas une chaine de caractères.

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

13 janvier 2021 à 17:30:15

Ton code ne compile pas, je n'ai donc pas le courage de le regarder !

Mais j'ai une question, pourquoi faire cela dans un fichier et non pas en mémoire ?

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2021 à 17:42:04

rouloude a écrit:

Ton code ne compile pas, je n'ai donc pas le courage de le regarder !

Mais j'ai une question, pourquoi faire cela dans un fichier et non pas en mémoire ?

C'est le seul moyen que je connais pour afficher quelque chose de compréhensible en console, en soit le jeu marche avec des tableaux, mais le coté affichage ce fait avec le fichier texte

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2021 à 17:56:55

Si tu n'es pas obligé d'utiliser un fichier, n'utilise pas un fichier, c'est trop compliqué (en tout cas pour moi)...

Une solution pourrait être d'utiliser un tableau de caractères (avec un '\0' final ce serait même une chaîne de caractères). La position dans ce tableau serait donnée par une formule similaire à celle de la ligne 3 (qu'on pourrait transformer en fonction, ou en 'inline').

Pour afficher le plateau de jeu, il suffit alors d'afficher le tableau de caractères (si c'est une chaîne, un simple 'puts' suffit).

-
Edité par robun 13 janvier 2021 à 17:57:36

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2021 à 18:06:58

socoolmen a écrit:

C'est le seul moyen que je connais pour afficher quelque chose de compréhensible en console, en soit le jeu marche avec des tableaux, mais le coté affichage ce fait avec le fichier texte

Tu n'as pas d'écran avec ton PC ?

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2021 à 18:39:38

Ton fichier comporte-t-il plusieurs lignes?
Pourquoi utiliser ftell()? Tu n'as qu'à compter les caractères que tu sautes.
Et tant qu'à utiliser ftell(), pourquoi pas fseek() qui va te positionner d'un seul coup.
J'ai l'impression que le problème n'est pas seulement l'affichage, mais de sauver le jeu entre deux coups, je me trompe?
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

13 janvier 2021 à 19:02:37

Pourtant : 

socoolmen a écrit:

C'est le seul moyen que je connais pour afficher quelque chose de compréhensible en console, ...



  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2021 à 19:31:47

socoolmen a écrit:

C'est le seul moyen que je connais pour afficher quelque chose de compréhensible en console


Ah bon ? Et

    printf("Plateau mis a jour");

n'est pas compréhensible en console ?

Je pense que tu exprimes mal ton problème. Connais-tu les différents format de printf() ?

Quoi qu'il en soit, si tu postais tout ton code....


-
Edité par edgarjacobs 13 janvier 2021 à 19:34:40

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

14 janvier 2021 à 14:32:13

Mon fichier texte est sous la forme https://prnt.sc/wnfbz5

Et je l'affiche tel quelle dans la console, on ne peut pas faire d'interface graphique. Donc c'etait plus compréhensible pour moi d'afficher dans la console avec ce fichier texte que avec le simple tableau ou j'enregistre les coordonnées des pions.  Et a chaque coup j'enregistre dans mon tableau mais je voudrais actualiser l'affichage aussi donc je voudrais mettre a jour ce fichier texte, qui pour moi etait plus simple

-
Edité par socoolmen 14 janvier 2021 à 14:32:27

  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2021 à 15:23:29

Hello,

dans l'idéal, tu auras bien conçu et bien modélisé tout le problème et tu seras arrivé à la conclusion suivante :

comme il faut toujours séparer un programme en module ayant des responsabilité bien définies, je vais avoir besoin d'une partie qui modélise le jeu indépendamment de toute visualisation. Cela signifie avoir quelque chose comme une structure qui contiendra entre autre un tableau qui ne modélisera que le plateau et qui contiendra quelque chose qui modélisera les pions (ou pas si une case est vide).

Du coup tu pourras ensuite te concentrer sur une procédure uqi te permettra de visualiser cette structure … graphique ou non.

Mais permet moi de te dire que si tu as besoin de passer par un fichier pour afficher quelque chose à l'écran en te servant du dit fichier comme un ersatz de tableau … ton projet est très mal parti.

  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2021 à 1:48:14

Salut, j'ai l'impression que tu t'embrouilles un peu : Ton but est de remplacer un O par un * dans un fichier si je comprends bien ? Dans ce cas tu as juste à parcourir ton fichier avec fgetc() comme tu le fais, pas besoin de contrôler la position dans le fichier.

Sinon tu es sûr de bien rentrer dans ta boucle ? Ta variable stop est initialisée à quelle valeur ?

Comme dit précédemment c'est plus simple de passer par un tableau de char plutôt qu'un fichier.

  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2021 à 2:16:54

socoolmen ne nous a pas dit s'il voulait sauver le jeu ou si c'est parce qu'il ne sait pas comment faire autrement.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

15 janvier 2021 à 9:30:34

Ça fait peut-être partie de la consigne
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2021 à 9:51:17

KevinGL a écrit:

Ton but est de remplacer un O par un * dans un fichier si je comprends bien ? Dans ce cas tu as juste à parcourir ton fichier avec fgetc() comme tu le fais, pas besoin de contrôler la position dans le fichier.

Il me semble que c'est parce qu'il doit remplacer un caractère précis, pas tous. Il y a peut-être d'autres 'O', mais c'est celui de la 3ème ligne, 5ème colonne qu'il doit remplacer. Quelque chose comme ça. Peut-être. Ou pas.

Bref, encore un sujet inutile puisqu'on n'a aucune information permettant d'apporter une aide concrète.

  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2021 à 15:58:39

Peut-être que ce petit exemple fera comprendre à socoolmen qu'un fichier n'est vraiment pas nécessaire
#include <stdio.h>


void display(char solitaire[][8]) {
	for(int i=0;i<7;i++)
		printf("%s\n",solitaire[i]);
	puts("");
}


int main(void) {
	char solitaire[7][8]=
	{
		{"  xxx  "},
		{"  xxx  "},
		{"xxxxxxx"},
		{"xxx xxx"},
		{"xxxxxxx"},
		{"  xxx  "},
		{"  xxx  "}
	};

	display(solitaire);
	
	// on déplace la bille de la 4ème ligne 6ème colonne
	// dans le 'trou' 4ème ligne 4ème colonne et
	// on élimine la bille de la 4ème ligne 5ème colonne
	solitaire[3][5]=' ';
	solitaire[3][3]='x';	
	solitaire[3][4]=' ';
	
	display(solitaire);
	
	return(0);
}


Reste à mettre autour de ça la gestion de l'entrée du joueur.

-
Edité par edgarjacobs 15 janvier 2021 à 16:56:46

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

22 janvier 2021 à 20:46:21

edgarjacobs a écrit:

Peut-être que ce petit exemple fera comprendre à socoolmen qu'un fichier n'est vraiment pas nécessaire

#include <stdio.h>


void display(char solitaire[][8]) {
	for(int i=0;i<7;i++)
		printf("%s\n",solitaire[i]);
	puts("");
}


int main(void) {
	char solitaire[7][8]=
	{
		{"  xxx  "},
		{"  xxx  "},
		{"xxxxxxx"},
		{"xxx xxx"},
		{"xxxxxxx"},
		{"  xxx  "},
		{"  xxx  "}
	};

	display(solitaire);
	
	// on déplace la bille de la 4ème ligne 6ème colonne
	// dans le 'trou' 4ème ligne 4ème colonne et
	// on élimine la bille de la 4ème ligne 5ème colonne
	solitaire[3][5]=' ';
	solitaire[3][3]='x';	
	solitaire[3][4]=' ';
	
	display(solitaire);
	
	return(0);
}



Reste à mettre autour de ça la gestion de l'entrée du joueur.

-
Edité par edgarjacobs 15 janvier 2021 à 16:56:46


Merci beaucoup ! C'etait la chose qui me manquait pour mon projet !! Plus que quelques détail et j'aurais terminé je te remercie !
  • Partager sur Facebook
  • Partager sur Twitter