2010-09-05 4 views
8

Si un fichier est ouvert à l'aide de la commande suivante:Ouverture d'un fichier 'a +' en mode

FILE *f1=fopen("test.dat","a+"); 

La page de manuel lit:

a +

Ouvert pour la lecture et annexant (écrire à la fin du fichier). Le fichier est créé s'il n'existe pas. La position initiale du fichier pour la lecture est au début du fichier, mais la sortie est toujours ajoutée à la fin du fichier.

donc f1 ont fait 2 pointeurs de compensation distincts, l'un pour l'autre pour lire & écrire?

Répondre

18

No.

Il y a juste un pointeur qui est d'abord au début du fichier, mais lors d'une opération d'écriture est tentée, il est déplacé à la fin du fichier. Vous pouvez le repositionner en utilisant fseek ou rewind n'importe où dans le fichier pour la lecture, mais les opérations d'écriture le ramèneront à la fin du fichier.

+0

Il peut également être utile de savoir que cela est généralement implémenté en termes de 'open' avec l'indicateur O_APPEND sur les systèmes POSIX: http://pubs.opengroup.org/onlinepubs/7908799/xsh/open.html –

+0

cas fseek n'est pas appelé avant de lire, beaucoup d'espaces sont imprimés dans le code ci-dessous. Je n'attendais rien à imprimer à l'écran. Mais aucune raison pour laquelle les espaces sont imprimés? Cela signifie qu'EOF n'est pas rencontré correctement. Si je décommente fseek ci-dessous, les données sont correctement imprimées à l'écran. 'int main() { FICHIER * fp1; char ch; fp1 = fopen ("m.txt", "a +"); fputs ("données ajoutées", fp1); // fseek (fp1,0, SEEK_SET); while ((ch = getc (fp1))! = EOF) { putc (ch, stdout); } fclose (fp1); return 0; } ' –

4

Non, il n'a qu'un seul pointeur.

3

Vous pouvez jamais lecture de mélange et les opérations d'écriture sur un FILE sans appeler fseek entre les deux. Cela peut fonctionner comme vous le souhaitez sur certaines implémentations, mais un programme qui en dépend a un comportement indéfini. Ainsi, les questions d'avoir 2 positions n'a aucun sens.

+0

True. Cependant, si vous voyez l'implémentation C d'un système d'exploitation qui prend en charge les opérations de fichier POSIX et où les opérations stdio FILE sont autre chose qu'un thin buffer sur les POSIX (ce qui * a * défini un comportement dans ce cas), * * signalez-le comme un bug contre ce système d'exploitation. –

+0

@DairaHopwood: Je suis confus au sujet de ce que vous essayez de dire. Le problème de mélanger la lecture et l'écriture sur stdio sans recherche intermédiaire est purement une question de mise en mémoire tampon. Cela n'a rien à voir avec les opérations sous-jacentes sur les descripteurs de fichiers. –

+0

Je veux dire que je considère un bogue d'implémentation stdio si son comportement indéfini dans ce cas a pour résultat tout autre chose que de changer où, le cas échéant, des données tamponnées sont écrites. C'est-à-dire que la spécification aurait dû être que le contenu du fichier résultant est défini par l'implémentation, plutôt qu'un comportement vraiment indéfini. Sinon, vous constaterez qu'une tonne de programmes ont des bogues de sécurité exploitables. –

Questions connexes