Вопрос

Как я могу выполнить запись из файла в общую память, используя 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>", да, это то, что будет возвращено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top