Den gemeinsamen Speicher schreiben
-
07-07-2019 - |
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 „
EDIT: Fand das Problem. Ich schreibe an die Eingabedatei, wenn ich sprintf nennen. Aber ich weiß noch nicht, warum ...
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.