Ne fseek() déplace le pointeur de fichier au début du fichier si le fichier a été ouvert en “a+b” mode?
Je veux ouvrir un fichier à l'aide de la "a+b", c'est à dire si elle n'existe pas, il est créé automatiquement, mais si c'est le cas je ne veux pas le remplacer. Je veux être capable de lire et d'écrire dans le fichier.
Le fichier est binaire, et je veux sauver les enregistrements d'un spécifique struct
. Alors je veux faire fseek()
à l'enregistrement que je veux et ensuite l'enregistrer à l'aide de fwrite()
.
Le code se présente comme suit (MyRecord
est un typedef
à un struct
, tandis que FILENAME
est un #define
le nom du fichier):
int saveRecord(MyRecord *pRecord, int pos)
{
FILE* file = fopen(FILENAME, "a+b");
if (file == NULL)
{
printf("Unable to open file %s\n", FILENAME);
return 0;
}
fseek(file, pos * sizeof(MyRecord), SEEK_SET);
fwrite(pRecord, sizeof(MyRecord), 1, file);
fclose(file);
return 1;
}
Toutefois, ce code ajoute l'enregistrement à la fin du fichier, même si j'ai mis pos
à 0. Pourquoi n'est-ce pas fseek()
avec SEEK_SET
de travail en mode ajout?
Je sais que je peux simplement ouvrir avec "r+b", et s'il ne l'ouvrir avec "wb", mais je veux savoir pourquoi cela ne fonctionne pas et pourquoi fseek()
avec SEEK_SET
est en laissant le pointeur de fichier à la fin. Toutes les références à des endroits où ce comportement est documenté apprécié (parce que je ne pouvais pas trouver n'importe ou, je suis en utilisant le mauvais mots-clés).
OriginalL'auteur jbx | 2011-04-03
Vous devez vous connecter pour publier un commentaire.
C'est parce que dans
a
mode, de l'écriture à laFILE*
toujours ajoute à la fin.fseek
, seul le pointeur de lecture dans ce mode. Cela est décrit dans la norme C 7.19.5.3 fopen:OriginalL'auteur Fred Foo
Plaine C n'a pas de toute façon saine de réaliser ce que vous voulez. Si vous êtes sur un système POSIX ou quoi que ce soit de près ou de loin, vous pouvez utiliser
fd=open(FILENAME, O_CREAT|O_RDRW, 0666)
et puisfdopen(fd, "rb+")
.Edit: une Autre chose que vous pourriez essayer, avec la plaine C:
Avez-vous essayé le
freopen
solution? Aucune idée si cela fonctionne dans la pratique (freopen
est mal spécifié et pourrait, en théorie, être inutile), mais il peut être ok.OriginalL'auteur R..
Utiliser "r+b" et en mode de secours "w+b" en cas d'échec.
Le "a+b" mode, vous permet de lire et d'ajouter, "r+b" permet d'écriture /lecture aléatoire.
La documentation pour
fopen
décrit la façon dont le fichier se comporte avec les différents modes.quelle condition? devrais-je dire "de secours "wb" si elle ne parvient pas à
errno == ENOENT
"Je suis en supposant un OS multitâche où un autre processus peut créer le fichier et de le remplir avec des données après la première
fopen
échoue, mais, avant la secondefopen
tentative. Si l'OP est de traiter avec un système intégré ou tout système fermé où l'on sait que cela n'arrivera pas, il peut être un non-problème.Je vois @R.. merci. Si c'est un problème
fwrite
à la même position dans le même temps par différents processus est également un problème; les OP pourraient utiliser la même méthode pour gérer à la fois les questions.OriginalL'auteur pmg