2009-09-14 8 views
0

Comment puis-je écrire à partir d'un fichier dans la mémoire partagée à l'aide de l'API Win32?Ecriture en mémoire partagée

Je possède ce code:

hFile = CreateFile("input.map", 
    GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_READ, 
    NULL, 
    OPEN_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL, 
    NULL); 

    hMapFile = CreateFileMapping(hFile, 
    NULL, 
    PAGE_READWRITE, 
    0, 
    0, 
    TEXT("SharedObject")); 

    lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile, 
    FILE_MAP_ALL_ACCESS, 
    0, 
    0, 
    0); 

    ReadFile(
    hFile, 
    lpMapAddress, 
    75, 
    &bytesRead, 
    NULL); 

    sprintf((char*)lpMapAddress, "<output 1>"); 

    printf((char*) lpMapAddress); 

Cependant, l'appel printf retourne uniquement "< sortie 1>" et non le contenu du fichier.

EDIT: a trouvé le problème. J'écris dans le fichier d'entrée quand j'appelle sprintf. Mais je ne sais toujours pas pourquoi ...

Répondre

2

Est-ce l'exemple complet du code? Il me semble que l'appel à sprintf place une chaîne terminée par zéro à lpMapAddress, ce qui écrase effectivement tout ce que vous lisez du fichier - au moins pour les besoins de votre déclaration printf.

Si vous voulez remplacer la première partie de ce que vous lisez avec la chaîne "<output 1>", vous pouvez le faire après la lecture du fichier:

char *tmp = "<output 1>"; 
strncpy((char*)lpMapAddress, tmp, strlen(tmp)); 

qui copie le texte de la chaîne, mais pas son terminaison nulle.

+0

Cela a aidé! Utilisé strcat() à la fin. – pypmannetjies

2

Le sprintf stocke un NUL après <output 1> et printf s'arrête au premier NUL.

(En outre, il est une mauvaise idée de passer un certain fichier aléatoire que le format à printf. Et si elle contenait % personnages? Mais c'est une autre question.)

J'écris au fichier d'entrée lorsque I appel sprintf. Mais je ne sais toujours pas pourquoi ...

Parce que ce que MapViewOfFile-t. Il associe le contenu du fichier à un bloc de mémoire. Le contenu actuel du fichier apparaît dans le bloc de mémoire et toutes les modifications que vous apportez à cette mémoire sont écrites dans le fichier.

0

Je ne comprends pas vraiment ce que vous obtenez ici. Peu importe le code que vous avez mis avant; Cette dernière ligne est toujours va retourner la chaîne que vous avez placé dans le tampon dans la ligne précédente "sprintf". Puisque c'est "<output 1>", oui c'est ce qui sera retourné.

+0

Eh bien, même en commentant l'appel de sprintf n'a pas d'effet ... – pypmannetjies

1

Je ne pense pas que vous deviez appeler ReadFile après le mappage. Accédez simplement au contenu de l'adresse lpMapAddress. Toutefois, l'utilisation de constantes pour MapViewOfFile ne permet pas d'utiliser le mappage de fichiers de mémoire.

+0

Bon point. Devinez une partie de ce code était inutile. – pypmannetjies

Questions connexes