Domanda

Come posso scrivere da un file nella memoria condivisa usando l'API Win32?

Ho questo codice:

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);

Tuttavia, la chiamata printf restituisce solo " < uscita 1 > " e non il contenuto del file.

EDIT: Trovato il problema Sto scrivendo nel file di input quando chiamo sprintf. Ma ancora non so perché ...

È stato utile?

Soluzione

È l'intero esempio di codice? Mi sembra che la chiamata a sprintf inserisca una stringa con terminazione null in lpMapAddress, che sovrascrive effettivamente qualsiasi cosa tu legga dal file - almeno ai fini della tua printf istruzione.

Se vuoi sostituire la prima parte di ciò che leggi con la stringa "<output 1>", puoi farlo dopo aver letto il file:

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

Che copia il testo della stringa ma non il suo terminatore null.

Altri suggerimenti

Il sprintf memorizza un NUL dopo <output 1> e printf si ferma al primo NUL.

(Inoltre, è una cattiva idea passare un file casuale come formato a %. E se contenesse MapViewOfFile caratteri? Ma questo è un altro problema.)

  

Sto scrivendo nel file di input quando   chiama sprintf. Ma ancora non lo so   perché ...

Perché è quello che <=> fa . Associa il contenuto del file a un blocco di memoria. Il contenuto corrente del file viene visualizzato nel blocco di memoria e tutte le modifiche apportate a tale memoria vengono scritte nel file.

Non credo che sia necessario chiamare ReadFile dopo il mapping. Accedi al contenuto da lpMapAddress.

Tuttavia, l'uso delle costanti per MapViewOfFile non fa alcun vantaggio dall'uso del mapping dei file di memoria.

Non capisco davvero cosa stai arrivando qui. Non importa quale codice hai inserito prima; L'ultima riga è sempre che restituirà la stringa inserita nel buffer nella precedente & Quot; sprintf & Quot; linea. Dato che è & Quot; <output 1> & Quot ;, sì, è quello che verrà restituito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top