سؤال

وكيف يمكنني الكتابة من ملف إلى الذاكرة المشتركة باستخدام API Win32 و؟

ولدي هذا الرمز:

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 في أول NUL.

و(أيضا، انها فكرة سيئة لتمرير بعض الملفات عشوائي كتنسيق إلى printf. ماذا لو أنها تحتوي على أحرف %؟ ولكن هذا موضوع آخر).

<اقتباس فقرة>   

وأنا أكتب ملف الإدخال عندما   استدعاء sprintf. ولكن ما زلت لا أعرف   لماذا ...

ولأن هذا ما MapViewOfFile <م> لا . ومن الزميلة محتويات الملف مع كتلة من الذاكرة. تظهر المحتويات الحالية من الملف في كتلة الذاكرة، وأية تغييرات تجريها على أن ذاكرة مكتوبة إلى ملف.

وأنا لا أعتقد أنك تحتاج إلى استدعاء طلب & ReadFile بعد رسم الخرائط. فقط الوصول إلى المحتوى من lpMapAddress.

ولكن استخدام الثوابت لMapViewOfFile يجعل أي فائدة من استخدام تعيين ملف الذاكرة.

وأنا لا أفهم حقا ما كنت تحصل على هنا. لا يهم ما الرمز الذي وضع من قبل؛ أن السطر الأخير هو <م> دائما سوف تعود السلسلة كنت قد وضعت في المخزن المؤقت في السطر السابق "sprintf". ومنذ ذلك هو "<output 1>"، نعم هذا ما سوف يتم إرجاعها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top