9
votes

Comment insérer et supprimer des caractères au milieu d'un fichier?

Je veux insérer et supprimer des caractères au milieu d'un fichier.

fopen () et fdopen () permettent simplement d'ajouter à la fin.

existe-t-il une méthode simple ou une bibliothèque existante qui permettent ces actions?


1 commentaires

Recommander la création de nouveaux fichiers avec des données insérées. À la fin, renommez et supprimez l'original.


4 Réponses :


7
votes

Il n'y a pas de méthode simple. Vous l'avez fait manuellement. Par exemple:

  1. Lisez le morceau que vous souhaitez insérer avant la mémoire
  2. Rechercher un nouveau poste
  3. Écrivez le morceau que vous venez de lire à la nouvelle position
  4. cherche à l'endroit où vous voulez insérer
  5. Écrivez les nouvelles données.

3 commentaires

Merci! Je dois donc utiliser "fopen (" 1.txt "," w ");" et puis fsek? :) Comme je vous comprends, la réponse est oui pour ma question.


@Infinity: Utilisez fopen ("1.txt", "r +") qui s'ouvre pour la lecture et écrire. Mode "W" écrase tout fichier qui aurait pu exister précédemment, vous laissant avec un fichier vide.


Je ne comprends pas les étapes 2 et 3. omg que vous voulez dire avec le fichier temporaire? ou tampon?. L'idée que ce que j'ai à l'esprit est d'ajouter la taille en octets de ce que vous souhaitez insérer à la taille des octets de l'origine du fichier. puis écrivez à la



3
votes

Utilisez Fonction Fsek pour déplacer le pointeur de fichier sur le Emplacement du fichier, puis vous pouvez effectuer une écriture là-bas. Mais, pour cela, vous devez savoir combien d'octets à partir de la fin ou au début du fichier que votre zone préférée pour l'écriture est.


0 commentaires

8
votes

Comme d'autres l'ont déjà dit, vous devez le faire manuellement et utiliser Fsek afin d'accéder à la place dans laquelle vous devez insérer ou ajouter des caractères. Vous pouvez facilement ajouter de nouveaux caractères au milieu en procédant comme suit:

  1. Accédez au dernier octet du fichier et stockez l'ancienne taille du fichier du fichier.
  2. Allez à l'endroit où vous souhaitez insérer les nouveaux personnages (disons que c'est la position): Fread (taille de fichier ancienne - position) octets et stockez-les dans un tampon.
  3. fsek à la position à nouveau.
  4. fwrite vos nouveaux personnages.
  5. fwrite le tampon que vous avez lu précédemment.

    Si vous souhaitez supprimer des caractères au milieu, cela est plus délicat. En fait, vous ne pouvez pas faire de fichier plus court. Vous avez deux possibilités: dans le premier, vous venez de

    1. Ouvrez le fichier et lisez le fichier sautant les caractères que vous souhaitez supprimer et les stocker dans un tampon
    2. Fermer et réouvrir le fichier à nouveau avec "B", son contenu est donc effacé,
    3. Écrivez le tampon et fermez le fichier.

      Dans la deuxième possibilité, vous:

      1. Lire à un tampon les personnages devant ceux que vous souhaitez supprimer.
      2. Fsek au début des caractères que vous souhaitez supprimer
      3. fwrite le tampon.
      4. Coupez le reste du fichier.

        point quatre est "délicat", car il n'y a pas de moyen standard (portable) de le faire. Une possibilité est d'utiliser les appels de système de système d'exploitation afin de tronquer le fichier. Une autre possibilité plus simple est de simplement que le fichier sera probablement plus grand qu'il ne devrait le faire, mais cela fera le tour.


3 commentaires

Merci beaucoup d'homme, je pense que vous en savez plus de choses à ce sujet. Pouvons-nous parler un peu de cela ailleurs?


Je suis intéressé par le sujet de recherche sur la position d'un texte dans un fichier. Peut-être qu'il y a un bon moyen ou dois-je faire tester Charachter par Charachter?


La recherche dans un fichier texte est, oui, essentiellement une matière de test de caractère par caractère. Mais c'est un autre sujet totalement différent: vous pouvez obtenir l'aide d'expressions régulières, par exemple.



1
votes

Prendre en compte ce que BaltaSarq a affiché, j'ai écrit les lignes suivantes. Vous devez connaître la position où vous souhaitez insérer les caractères

long Fin;
long lSize;
fseek(fd, 0L, SEEK_END);
Fin = ftell(fd);//get the old file size
fseek(fd, position, SEEK_SET);//"position" must be declared and initialized 
char * buffer;
lSize = Fin - position;//length from where you want to insert the chars to the eof

buffer = (char*) malloc(sizeof(char) * lSize);
size_t result = fread(buffer, 1, lSize, fd);//fread (Fin - position) into buffer
fseek(fd, position, SEEK_SET);//fseek to position

fputs(word, fd);//word is a char pointer that contains the text to be inserted
fputs(buffer, fd);//fwrite the buffer


0 commentaires