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,&copy,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