Vra

Hoe kan ek van 'n lêer na gedeelde geheue skryf met die Win32 API?

Ek het hierdie kode:

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

Die printf-oproep gee egter slegs "< uitvoer 1 >" terug en nie die inhoud van die lêer nie.

EDIT:Het die probleem gevind.Ek skryf na die invoerlêer wanneer ek sprintf bel.Maar ek weet steeds nie hoekom nie...

Was dit nuttig?

Oplossing

Is dit die hele kode monster? Dit lyk vir my soos die oproep om plekke sprintf n nul beëindig string by lpMapAddress, wat effektief oor skryf alles wat jy lees van die lêer -. Ten minste vir die doeleindes van jou printf verklaring

As jy wil hê dat die eerste deel van wat jy lees met die string "<output 1>" vervang, kan jy dit doen na die lees van die lêer:

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

Dit afskrifte van die teks van die string, maar nie sy nul terminator.

Ander wenke

Die sprintf slaan 'n NUL na <output 1>, en printf stop by die eerste NUL.

(Ook is dit 'n slegte idee om 'n paar random lêer slaag as die formaat te printf. Wat as dit % karakters bevat? Maar dis 'n ander saak.)

  

Ek skryf aan die insette lêer toe ek   noem sprintf. Maar ek weet nog steeds nie   hoekom ...

Want dit is wat MapViewOfFile nie . Dit assosieer inhoud van die lêer se met 'n blok van die geheue. Die huidige inhoud van die lêer verskyn in die geheue blok, en enige veranderinge wat jy maak om dit geheue is geskryf om die lêer.

Ek dink nie jy hoef te ReadFile bel na kartering. toegang net die inhoud van die lpMapAddress.

Maar met behulp van konstantes vir MapViewOfFile maak geen voordeel uit die gebruik van geheue lêer kartering.

Ek verstaan ​​nie regtig wat jy hier bedoel nie.Dit maak nie saak watter kode jy voor plaas nie;Die laaste reël is altyd gaan die string wat jy in die buffer geplaas het in die vorige "sprintf" reël terugstuur.Aangesien dit is "<output 1>", ja dit is wat teruggegee sal word.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top