1 votes

remplacement de chaînes de caractères dans un fichier en utilisant C

Je ne l'ai pas encore mis en œuvre, j'en suis encore au stade de la réflexion, mais je dois parcourir un fichier et remplacer une certaine chaîne par une autre. Par exemple,

<img src="/images/logo.gif" ...

devrait devenir

<img src="/proxy/www.example.com/images/logo.gif" ...

Des conseils sur la façon dont je peux aborder cette question ? Peut-être existe-t-il des fonctions C de "remplacement de chaîne" qui feraient cela pour moi et que je ne connais pas... ?

Actuellement, si je devais écrire cette fonction moi-même, je lui donnerais comme paramètres le fichier, la chaîne à remplacer, la chaîne de remplacement. Ensuite, je parcourrais manuellement le fichier à la recherche d'une occurrence de la chaîne et je la recréerais. Cela semble toutefois très inefficace. Existe-t-il de meilleures façons de procéder ?

Merci, Hristo

1voto

Eli Bendersky Points 82298

Non, il n'existe pas de fonction en C qui remplace une chaîne de caractères dans un fichier. Vous devez l'implémenter vous-même.

Cela dit, ce que vous nous montrez est du HTML, et le HTML est délicat, car il est hiérarchisé. Êtes-vous tenu de l'analyser correctement ? Parce que si c'est le cas, la tâche est beaucoup plus difficile. Vu que c'est un devoir à domicile, j'en doute, donc vous pourriez vous en sortir :

  1. ouvrir le fichier et le charger en mémoire (en supposant qu'il n'est pas trop grand - s'il l'est, vous pouvez l'écrire dans un fichier temporaire et le déplacer vers le fichier original après avoir terminé)
  2. utiliser en permanence strstr pour trouver la chaîne d'ancrage que vous devez commencer à remplacer
  3. remplacer
  4. répétez 2 et 3 jusqu'à ce que vous ayez terminé le fichier
  5. réécrire le fichier

1voto

Comme il s'agit d'un travail à domicile, je pars du principe que la chaîne ne peut pas s'étendre sur plusieurs lignes. Si cette hypothèse est correcte (et sauf complications liées au "remplacement de texte en HTML"), alors.. :

1 Lire la ligne suivante

2 Remplacer la chaîne et écrire la ligne (dans un autre fichier)

3 Si ce n'est pas à la fin, aller à #1

4 Win \o /

Ou peut-être que le professeur veut autre chose haussement d'épaules

1voto

RarrRarrRarr Points 1538

Tout d'abord, le C est un langage génial, mais c'est l'un des langages les plus pénibles pour effectuer ce type d'opération. Je devais juste le dire.

Pouvez-vous supposer sans risque que le contenu de l'ensemble du fichier peut tenir en mémoire ? Si c'est le cas :

allocate buffer big enough to hold file contents
read entire file into buffer
inputPtr = 0

while(inputPtr < size of buffer) {
    replacePosition = strstr(inputPtr, stringToReplace);
    if (replacePosition != NULL)
        writeUntil = replacePosition - 1
    else
        writeUntil = end of buffer

    write out buffer from inputPtr to writeUntil inclusive (could be 0 bytes)

    if (replacePosition == NULL) break

    write out the replacement string

    inputPtr = replacePosition + strlen(stringToReplace)
}

0voto

R Samuel Klatchko Points 44549

Comme il s'agit d'un devoir, je ne vous donnerai pas de réponse, mais je vais vous signaler un problème classique qui fait trébucher les gens.

En C, il est plus facile de lire un nombre fixe d'octets (vous pouvez essayer de le faire ligne par ligne mais si une ligne est trop longue, cela revient à lire un nombre fixe d'octets). Si la chaîne que vous essayez de remplacer finit par être divisée entre un tampon et un second tampon :

buf1 -> "...<img src=\"/ima"
buf2 -> "ges/logo.gif\"..."

vous ne serez pas en mesure de faire une simple recherche/remplacement en mémoire.

0voto

Karthik Points 1226

Essayez vous la fonction strcpy pour cela,

Assignez l'url dans une chaîne et remplacez-la par la fonction strcpy.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X