Rechercher : dans
Par :

[langage C]remplacer chaine de caractere

Dernière réponse le 5 jui 2007 à 16:35:20 djim, le 29 jun 2007 à 16:31:58 
 Signaler ce message aux modérateurs

Bonjour,

j'aimerais savoir s'il est possible de faire en langage C ceci:

j'ai par exemple un fichier test.txt

dans lequel il se trouve la chaine de caractere suivante: toto

est il possible de remplacer cette chaine de caractere par une autre préalablement demander à l'utilisateur.

exemple:

l'utilisateur saisit comme chaine de remplacement tom

Puis le programme ouvre le fichier test, et compare chaque chaine de caractere , et quand il trouve la chaine toto, il la remplace par tom .

c'est possible ou pas ?? (je suis pas sure d'être bien clair lol)

Merci pour votre aide éventuelle.

Configuration: Windows XP
Firefox 2.0.0.4

Meilleures réponses pour « [langage C]remplacer chaine de caractere » dans :
Langage C - Les chaînes de caractères Voir Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Caractéristiques du langage C VoirLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

Doctor C, le 29 jun 2007 à 16:47:56

C'est bien sur possible...

Ça fait un moment que j'ai fait du C et je connais pas toutes les fonctions par coeur.
Je sais pas si tu es un débutant ou non alors, je vais te donner les fonctions clés à utiliser :

fopen : permet d'ouvrir un fichier en lecture/écriture/les deux ([ http://gilles.chagnon.free.fr/cours/cgi/cours5.html )]
strcmp : permet de comparer deux chaines de charactère ([ http://www.ltam.lu/tutoriel_ansi_c/prg-c81.htm )]

je t'avoue que je ne me souvient plus comment remplacer une chaine de charactère par une autre en C (il existe des fonctions replace en C++ et C#, mais en C, j'oublie)

Si tu as besoin de plus de précisions, dis le!
Echo "Lima Mike Alfa";

Répondre à Doctor C

2

djim, le 30 jun 2007 à 11:19:52

Merci pour ta réponse !!

j'ai quelques petites notions en C.

ouvrir un fichier je connaissais

la comparaison de chaque chaine de caractere avec celle que je saissit au début se fait avec strcmp mais pour qu'il ne le fasse pas qu'avec la premiere chaine de caractere du fichier, il faut que je place le strcmp dans une boucle, et que je l'incremente à a chaque fois, ou il y a plus simple ??

Répondre à djim

3

djim, le 5 jui 2007 à 11:21:40

J'ai un fichier test.txt qui contient une chaine de caractère toto, je souhaite remplacer cette chaine par une autre préalablement saisie par l'utilisateur.

Est ce possible en C d'ouvrir mon fichier test.txt afin de chercher la chaine toto et de la remplacer par celle saisie par l'utilisateur ??

Répondre à djim

4

ekra, le 5 jui 2007 à 12:19:42
  • +1

Bonjour,

Je pense que tout d'abord, dans ton fichier il faut que toutes les chaines aient la même longueur allouée. On supposera que c'est MAX_CHAINE. Sinon il faut déplacer toute la suite des nom, c'est plutôt ingérable...

char chaine[MAX_CHAINE];
FILE* fp=fopen("test.txt" , "rt");
void *ret;

while ((ret = fgets(chaine , MAX_CHAINE , fp)) != NULL && strcmp(chaine , "toto") ) ;
 
if (ret == NULL) {
  /* Nom non trouvé */
 }
else {
  /* Nom trouvé */
  fseek(fp, - sizeof(char)*MAX_CHAINE , SEEK_CUR); /* On se replace au debut de la chaine trouvée */
  fprintf(fp , "nouveau_nom");
}  

Je n'ai pas testé, mais ça peut peut-être t'aider. Ceci est une signature.

Répondre à ekra

5

djim, le 5 jui 2007 à 14:17:09

Je n'ai pas précisé mais la chaine initiale et celle qui la remplace ne sont pas de la même longueur

Répondre à djim

6

djim, le 5 jui 2007 à 14:34:27

Je viens d'essayer d'adapter ta solution à mon programme mais cela ne modifie pas mon fichier texte.

chaine et toto seront de longueurs différentes en faite.

j'ai rajouté des printf dans le IF et le ELSE et a chaque fois ,que les chaines soient identiques ou différentes j'arrive au printf du else.

Répondre à djim

7

ekra, le 5 jui 2007 à 14:49:35

Ce n'est pas les longueur de chaines qui doivent être constantes mais l'espace consacré à la chaine dans le fichier.
Ton fichier doit être structuré comme un tableau, avec pour chaque case un espace reservé de longueur MAX_CHAINE.
Supposons que MAX_CHAINE est 5.
On entre les chaines :
a
ba
et
blob
j

Il faut que tu te débrouilles pour que ton fichier ressemble à :

a \n 0 0 0 b a \n 0 0 e t \n 0 0 b l o b \n j \n 0 0 0 0


Si tu ne fais pas cela, comprends bien que tu devrais déplacer tout ce qui suit dans le fichier en cas de changement de taille de la chaine (fort probable !) Ceci est une signature.

Répondre à ekra

8

djim, le 5 jui 2007 à 14:52:56

Je n'ai qu'une chaine à remplacer dans mon fichier:

toto -> nouveau_mot

Répondre à djim

9

ekra, le 5 jui 2007 à 15:02:38

Et bien dans ce cas tu n'a qu'a réserver l'espace MAX_CHAINE juste pour les champs susceptibles d'êtres changés. Ceci est une signature.

Répondre à ekra

10

djim, le 5 jui 2007 à 15:37:15

Extrait de mon fichier:

fdsfsddsfsd fsfdsfsd

zze dsf effef

f dfsdf toto
fsdfsd

fdsfsfsdffer

Répondre à djim

11

ekra, le 5 jui 2007 à 15:46:31

Oui mais on ne sait pas à quoi ça correspond... Qu'as-tu entré ?

Fait plutôt un "od -c | less" on y verra plus clair :) Ceci est une signature.

Répondre à ekra

12

djim, le 5 jui 2007 à 15:57:04

C'est un extrait de mon fichier de base par exemple. je souhaite remplacer toto par nouveau.

Je ne parviens pas à modifier mon fichier pour le moment

voici ton code avec mes variables:

toto = chaine à remplacer
les chaines nes ont pas de la même longueur.


while (((ret = fgets(chaine_saisie_par_user,11,fp))!= NULL) && strcmp(chaine_saisie_par_user,"toto"))
{
if (ret == NULL)
{
printf("mot nom trouvé");
}
else
{

fseek(fp, - sizeof(char)*11,SEEK_CUR);
fprintf(fp,"%s",chaine_saisie_par_user);
printf("remplacement effectué\n");
fclose(fp);
}
}

Répondre à djim

13

ekra, le 5 jui 2007 à 16:12:17

Attend, mon code c'est pas ça...
Déjà le if n'est pas dans le while...

Regarde bien :) Ceci est une signature.

Répondre à ekra

14

djim, le 5 jui 2007 à 16:26:27

A oui effectivement.

j'ai corrigé cette erreur mais maintenant il ne trouve jamais le mot

mot non trouvé

Répondre à djim

15

 ekra, le 5 jui 2007 à 16:35:20

Euh oui effectivement.
Je pense qu'il faut utiliser fread() et non fgets. Comme ça il lira la chaine jusqu'au caractère d'indice MAX_CHAINE même si la chaine est plus petite. Mais ca c'est dans le cas ou tous les champs du fichiers ont la longueur MAX_CHAINE (reservée).
Sinon il faut que tu te débrouilles pour arriver à l'endroit ou il y a la chaine recherchée. Ceci est une signature.

Répondre à ekra
Collection CommentÇaMarche.net