Pergunta

Como posso escrever a partir de um arquivo de memória compartilhada usando a API Win32?

Eu tenho esse 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);

No entanto, a chamada printf apenas retorna "" e não o conteúdo do arquivo.

EDIT: Encontrado o problema. Estou escrevendo para o arquivo de entrada quando eu chamo sprintf. Mas eu ainda não sei porque ...

Foi útil?

Solução

Esta é toda a amostra de código? Parece-me que a chamada para sprintf coloca uma string terminada em nulo no lpMapAddress, o que efetivamente substitui o que você ler o arquivo -., Pelo menos para efeitos da sua declaração printf

Se você quiser substituir a primeira parte do que você lê com o "<output 1>" corda, você poderia fazer isso depois de ler o arquivo:

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

que copia o texto da string mas não o seu terminador nulo.

Outras dicas

As lojas sprintf um NUL após <output 1> e printf pára no primeiro NUL.

(Além disso, é uma má idéia para passar algum arquivo aleatório como o formato a printf. E se ele continha caracteres %? Mas isso é outra questão.)

Estou escrevendo para o arquivo de entrada quando eu sprintf chamada. Mas eu ainda não sei por isso ...

Porque é isso que MapViewOfFile faz . Ele associa o conteúdo do arquivo com um bloco de memória. Os conteúdos atuais do arquivo aparecem no bloco de memória, e todas as alterações feitas para que a memória são gravados no arquivo.

Eu não acho que você precisa chamar ReadFile após o mapeamento. Basta acessar o conteúdo do lpMapAddress.

No entanto, usando as constantes para MapViewOfFile faz nenhum benefício do uso de mapeamento de arquivo de memória.

Eu realmente não entendo o que você está chegando aqui. Não importa o que o código que você colocou antes; Essa última linha é sempre vai retornar a string que você colocou no buffer na linha anterior "sprintf". Desde que é "<output 1>", sim é isso que vai ser devolvido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top