الكتابة إلى الذاكرة المشتركة
-
07-07-2019 - |
سؤال
وكيف يمكنني الكتابة من ملف إلى الذاكرة المشتركة باستخدام 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>
"، نعم هذا ما سوف يتم إرجاعها.