Question

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

J'ai 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 ne renvoie que " < sortie 1 > " et non le contenu du fichier.

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

Était-ce utile?

La solution

S'agit-il de l'exemple de code complet? Il me semble que l'appel à sprintf place une chaîne à lpMapAddress, ce qui écrase tout ce que vous lisez dans le fichier - du moins aux fins de votre printf instruction.

Si vous souhaitez remplacer la première partie de ce que vous lisez par la chaîne "<output 1>", vous pouvez le faire après avoir lu le fichier:

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

Cela copie le texte de la chaîne mais pas son terminateur null.

Autres conseils

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

(En outre, c’est une mauvaise idée de passer un fichier aléatoire comme format à %. Que se passe-t-il s’il contenait MapViewOfFile caractères? Mais c’est un autre problème.

  

J'écris dans le fichier d'entrée quand je   appelez sprintf. Mais je ne sais toujours pas   pourquoi ...

Parce que c'est ce que <=> fait . 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.

Je ne pense pas que vous ayez besoin d'appeler ReadFile après le mappage. Accédez simplement au contenu depuis lpMapAddress.

Toutefois, l'utilisation de constantes pour MapViewOfFile ne permet pas de mapper le mappage de fichiers en mémoire.

Je ne comprends pas vraiment à quoi vous voulez en venir ici. Peu importe le code que vous avez mis avant; toujours cette dernière ligne retournera la chaîne que vous avez placée dans la mémoire tampon dans le & Précédent; sprintf & "; ligne. Puisque c'est & "; <output 1> &"; Oui, c'est ce qui sera retourné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top