Pregunta

¿Cómo puedo escribir desde un archivo a la memoria compartida utilizando la API de Win32?

Tengo este código:

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

Sin embargo, la llamada printf sólo devuelve "< de salida 1 >" y no el contenido del archivo.

EDITAR:Encuentra el problema.Estoy escribiendo el archivo de entrada cuando llamo sprintf.Pero yo todavía no sé por qué...

¿Fue útil?

Solución

¿Es este el ejemplo de código completo? Me parece que la llamada a sprintf coloca una cadena terminada en nulo en lpMapAddress, que sobrescribe efectivamente lo que leyó del archivo, al menos para los propósitos de su declaración de printf.

Si desea reemplazar la primera parte de lo que lee con la cadena "<output 1>", puede hacerlo después de leer el archivo:

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

Eso copia el texto de la cadena pero no su terminador nulo.

Otros consejos

El sprintf almacena un NUL después de <output 1>, y printf se detiene en la primera NUL.

(También, es una mala idea pasar algunos de archivo aleatorio como el formato para printf.Lo que si contenía % caracteres?Pero ese es otro asunto.)

Estoy escribiendo el archivo de entrada cuando me llame sprintf.Pero aún no sé por qué...

Porque eso es lo que MapViewOfFile ¿.Se asocia el contenido del archivo con un bloque de memoria.El contenido actual del archivo aparecerá en el bloque de memoria, y cualquier cambio que se realice en esa memoria se escriben en el archivo.

No creo que necesite llamar a ReadFile después del mapeo. Simplemente acceda al contenido desde lpMapAddress.

Sin embargo, el uso de constantes para MapViewOfFile no beneficia el uso de la asignación de archivos de memoria.

Realmente no entiendo lo que estás haciendo aquí. No importa qué código pongas antes; Esa última línea siempre devolverá la cadena que colocó en el búfer en el & Quot; sprintf & Quot; línea. Como eso es & Quot; <output 1> & Quot ;, sí, eso es lo que se devolverá.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top