Запись в общую память
-
07-07-2019 - |
Вопрос
Как я могу выполнить запись из файла в общую память, используя Win32 API?
У меня есть этот код:
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);
Однако вызов printf возвращает только "< вывод 1 >", а не содержимое файла.
Редактировать:Нашел проблему.Я записываю данные во входной файл, когда вызываю sprintf.Но я все еще не знаю почему...
Решение
Это весь пример кода?Мне кажется, это призыв к sprintf
помещает строку, заканчивающуюся нулем, в lpMapAddress
, который эффективно перезаписывает все , что вы читаете из файла - по крайней мере, для целей вашего printf
заявление.
Если вы хотите заменить первую часть того, что вы читаете, строкой "<output 1>"
, вы могли бы сделать это после прочтения файла:
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
Это копирует текст строки, но не ее нулевой завершитель.
Другие советы
В sprintf
сохраняет значение NUL после <output 1>
, и printf
останавливается на первом нулевом значении.
(Кроме того, это плохая идея передавать какой-то случайный файл в качестве формата в printf
.Что, если в нем содержалось %
персонажи?Но это уже другая проблема.)
Я записываю данные во входной файл, когда я вызываю sprintf.Но я все еще не знаю почему...
Потому что это то, что MapViewOfFile
делает.Он связывает содержимое файла с блоком памяти.Текущее содержимое файла отображается в блоке памяти, и любые изменения, которые вы вносите в эту память, записываются в файл.
Я не думаю, что вам нужно вызывать ReadFile после сопоставления.Просто получите доступ к содержимому с lpMapAddress.
Однако использование констант для MapViewOfFile не дает никакой выгоды от использования сопоставления файлов в памяти.
Я действительно не понимаю, к чему вы здесь клоните.Не имеет значения, какой код вы поставили перед;Эта последняя строка - всегда собираюсь вернуть строку, которую вы поместили в буфер в предыдущей строке "sprintf".Поскольку это "<output 1>
", да, это то, что будет возвращено.