C, unix et de l'écrasement d'un char avec write(), open() et lseek()
J'ai besoin de remplacer un caractère dans un fichier texte avec"?". Il ne fonctionne pas comme prévu.
Le fichier de contenu est " abc " (sans les guillemets) et j'ai eu à utiliser les appels système unix: lseek(), open() et write(). Je ne peux pas utiliser la norme C e/S de fichier fonctions.
Le plan est à terme de exand en plus généralisée "rechercher et remplacer" de l'utilitaire.
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
int file = open("data", O_RDWR); //open file with contents 'abc'
lseek(file,0,0); //positions at first char at beginnging of file.
char buffer;
read(file,&buffer, sizeof(buffer));
printf("%c\n", buffer); //text file containing 'abc', it prints 'a'.
if (buffer == 'a'){
char copy = '?';
write(file,©,1); //text file containing 'abc' puts '?' were 'b' is.
}
close(file);
}
Le fichier "data" contient abc, je veux remplacer un avec ? et de le rendre ?bc mais je suis un?c
read() est de lire le bon char, mais write() est écrit sur le caractère suivant.
Pourquoi est-ce?
Été la recherche sur google pendant des heures.
Grâce
À partir d'une expérience amère, de googler autour et de trouver des demi-code de travail est la fracturation hydraulique ennuyeux (il n'est pas besoin de l'aide avec le code du travail, le droit?). Donc: au-dessus de if( buffer =='a') lseek(fichier, -1, 1); et ça fonctionne
OriginalL'auteur Pygar | 2012-04-13
Vous devez vous connecter pour publier un commentaire.
La réponse est en fait intégré dans votre propre code, d'une certaine manière.
La
lseek
appelez-vous faire juste aprèsopen
n'est pas nécessaire parce que la première foisopen
un fichier le courant chercher décalage est nul.Après chaque succès de la
read
ouwrite
opération, le décalage de recherche se déplace vers l'avant par le nombre d'octets lus/écrits. (Si vous ajoutezO_APPEND
à votreopen
le décalage de recherche se déplace également à seulement avant chaque écriture, le courant de fin de fichier, mais ce n'est pas pertinent à ce stade.)Puisque vous avez réussi à
read
un octet, votre recherche se déplace de 0 à 1. Si vous voulez le remettre à 0, vous devez le faire manuellement.(Vous devriez également vérifier que chaque opération réussit effectivement, bien sûr, mais je suppose que vous n'par souci de concision ici.)
OriginalL'auteur torek
Votre appel à read() déplace le pointeur de fichier en avant un octet, c'est à dire de 0 à 1. Depuis que vous utilisez le même descripteur de fichier ("fichier int = ...") pour la lecture et l'écriture, la situation est la même pour la lecture et l'écriture.
À écrire plus de l'octet que l'on vient de lire, vous avez besoin de lseek() de retour d'un octet après
est vrai.
OriginalL'auteur mfrankli
lseek est au mauvais endroit. Une fois 'a' a été trouvé, il écrit les"? "dans le prochain emplacement disponible (ce qui arrive de remplacer "b"). De correctif, vous devez modifier la position actuelle à l'aide de lseek AVANT de vous écrire.
OriginalL'auteur Veebot