Frage

Wie kann ich aus einer Datei in dem gemeinsamen Speicher schreibe mit dem Win32-API?

Ich habe diesen 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);

jedoch nur der printf Aufruf gibt „“ und nicht den Inhalt der Datei.

EDIT: Fand das Problem. Ich schreibe an die Eingabedatei, wenn ich sprintf nennen. Aber ich weiß noch nicht, warum ...

War es hilfreich?

Lösung

Ist das das gesamte Codebeispiel? Es scheint mir, wie der Anruf tätigt einen nullterminierten String an sprintf lpMapAddress, die effektiv überschreibt, was Sie aus der Datei lesen -. Zumindest für die Zwecke Ihrer printf Anweisung

Wenn Sie den ersten Teil ersetzen möchten, was Sie mit dem String "<output 1>" lesen, könnten Sie dies tun, nachdem Sie die Datei zu lesen:

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

Das kopiert den Text des Strings, aber nicht seine Nullabschluss.

Andere Tipps

Die sprintf speichert eine NUL nach <output 1> und printf stoppt beim ersten NUL.

(Außerdem ist es eine schlechte Idee, einige zufällige Datei als Format zu übergeben printf. Was passiert, wenn es % Zeichen enthalten? Aber das ist ein anderes Thema.)

  

Ich schreibe an die Eingabedatei, wenn ich   rufen sprintf. Aber ich weiß noch nicht   warum ...

Weil das ist, was MapViewOfFile hat . Es ordnet den Inhalt der Datei mit einem Speicherblock. Der aktuelle Inhalt der Datei erscheint in dem Speicherblock, und alle Änderungen an diesem Speicher vornehmen, werden in die Datei geschrieben.

Ich glaube nicht, Sie brauchen ReadFile- nach Zuordnung zu nennen. Zugriff nur den Inhalt aus dem lpMapAddress.

Allerdings macht mit Konstanten für MapViewOfFile keinen Nutzen aus dem Speicher-Dateizuordnung verwendet wird.

ich nicht wirklich verstehen, was Sie hier bekommen. Es spielt keine Rolle, welchen Code Sie vor setzen; Das letzte Zeile ist immer gehen die Zeichenfolge kehren Sie in den Puffer in der vorherigen „sprintf“ Linie platziert. Da das heißt „<output 1>“, ja das ist, was zurückgegeben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top