.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2005-2016, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-1.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH fmemopen 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم fmemopen \- فتح الذاكرة كدفق .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBFILE *fmemopen(\fPsize_t size; \fB void \fP\fIbuf\fP\fB[\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB, const char *\fP\fImode\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBfmemopen\fP(): .nf منذ glibc 2.10: _POSIX_C_SOURCE >= 200809L قبل glibc 2.10: _GNU_SOURCE .fi .SH الوصف تفتح الدالة \fBfmemopen\fP() دفقًا يسمح بالوصول المُحدد بواسطة \fImode\fP. يسمح الدفق بإجراء الإدخال/الإخراج على سلسلة المحارف أو مخبأ الذاكرة المُشار إليه بواسطة \fIbuf\fP. .P يُحدد المعامل \fImode\fP دلالات الإدخال/الإخراج على الدفق، وهو أحد التالي: .TP \fIr\fP يُفتح الدفق للقراءة. .TP \fIw\fP يُفتح الدفق للكتابة. .TP \fIa\fP إلحاق؛ يُفتح الدفق للكتابة، مع تعيين موضع المخبأ المبدئي إلى أول بايت فارغ. .TP \fIr+\fP يُفتح الدفق للقراءة والكتابة. .TP \fIw+\fP يُفتح الدفق للقراءة والكتابة. تُقتطع محتويات المخبأ (أي، يُوضع \[aq]\[rs]0\[aq] في أول بايت من المخبأ). .TP \fIa+\fP إلحاق؛ يُفتح الدفق للقراءة والكتابة، مع تعيين موضع المخبأ المبدئي إلى أول بايت فارغ. .P يحتفظ الدفق بمفهوم الموضع الحالي، وهو الموقع الذي ستُجرى فيه عملية الإدخال/الإخراج التالية. يُحدّث الموضع الحالي ضمنيًا بواسطة عمليات الإدخال/الإخراج. يمكن تحديثه صراحةً باستخدام \fBfseek\fP(3)، وتحديده باستخدام \fBftell\fP(3). في جميع الأوضاع عدا الإلحاق، يُعيّن الموضع المبدئي إلى بداية المخبأ. في وضع الإلحاق، إذا لم يُعثر على بايت فارغ داخل المخبأ، فإن الموضع المبدئي يكون \fIsize+1\fP. .P إذا حُدد \fIbuf\fP كـ NULL، فإن \fBfmemopen\fP() تخصص مخبأً بحجم \fIsize\fP بايت. هذا مفيد لتطبيق يريد كتابة بيانات إلى مخبأ مؤقت ثم قراءتها مرة أخرى. يُعيّن الموضع المبدئي إلى بداية المخبأ. يُحرّر المخبأ آليًا عند إغلاق الدفق. لاحظ أنه لا توجد طريقة للمتصل للحصول على مؤشر إلى المخبأ المؤقت المُخصص بواسطة هذه الاستدعاء (لكن انظر \fBopen_memstream\fP(3)). .P إذا لم يكن \fIbuf\fP NULL، فيجب أن يشير إلى مخبأ بحجم \fIsize\fP بايت على الأقل مُخصص بواسطة المتصل. .P عندما يُمسح دفق فُتح للكتابة (\fBfflush\fP(3)) أو يُغلق (\fBfclose\fP(3))، يُكتب بايت فارغ في نهاية المخبأ إذا وُجدت مساحة. يجب على المتصل ضمان توفر بايت إضافي في المخبأ (وأن \fIsize\fP يحسب ذلك البايت) للسماح بذلك. .P في دفق فُتح للقراءة، لا تتسبب البايتات الفارغة (\[aq]\[rs]0\[aq]) في المخبأ في إرجاع عمليات القراءة لإشارة نهاية الملف. ستشير قراءة من المخبأ إلى نهاية الملف فقط عندما يتقدم موضع المخبأ الحالي \fIsize\fP بايت بعد بداية المخبأ. .P تحدث عمليات الكتابة إما في الموضع الحالي (للأوضاع غير الإلحاق)، أو في الحجم الحالي للدفق (لوضع الإلحاق). .P تؤدي محاولات كتابة أكثر من \fIsize\fP بايت إلى المخبأ إلى خطأ. مبدئيًا، ستكون هذه الأخطاء مرئية (بغياب البيانات) فقط عند مسح مخبأ \fIstdio\fP. قد يكون تعطيل التخزين المؤقت بالاستدعاء التالي مفيدًا لاكتشاف الأخطاء في وقت عملية الإخراج: .P .in +4n .EX setbuf(stream, NULL); .EE .in .SH "قيمة الإرجاع" عند الإكمال بنجاح، تُرجع \fBfmemopen\fP() مؤشر \fIFILE\fP. وإلا، يُرجع NULL ويُعيّن \fIerrno\fP للإشارة إلى الخطأ. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBfmemopen\fP()، T} سلامة الخيوط MT\-Safe .TE .SH المعايير POSIX.1\-2008. .SH التاريخ glibc 1.0.x. POSIX.1\-2008. .P .\" http://austingroupbugs.net/view.php?id=396 يحدد POSIX.1\-2008 أن \[aq]b\[aq] في \fImode\fP يجب تجاهله. ومع ذلك، يعدل التصحيح التقني 1 المعيار للسماح بمعالجة خاصة بالتنفيذ لهذه الحالة، مما يسمح بمعالجة glibc لـ \[aq]b\[aq]. .P .\" مع glibc 2.22، أُزيل الوضع الثنائي (انظر أدناه)، وثُبتت العديد من الأخطاء القديمة في تنفيذ \fBfmemopen\fP()، وأُنشئ رمز جديد مُرقّم لهذه الواجهة. .SS "الوضع الثنائي" من glibc 2.9 إلى glibc 2.21، دعم تنفيذ glibc لـ \fBfmemopen\fP() وضعًا "ثنائيًا"، يُفعّل بتحديد الحرف \[aq]b\[aq] كالحرف الثاني في \fImode\fP. في هذا الوضع، لا تُضيف عمليات الكتابة ضمنيًا بايت فارغ ختامي، ويكون \fBfseek\fP(3) \fBSEEK_END\fP نسبيًا لنهاية المخزن المؤقت (أي القيمة المحددة بواسطة وسيط \fIsize\fP)، بدلاً من طول السلسلة الحالي. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=12836 أصاب خطأ API تنفيذ الوضع الثنائي: لتحديد الوضع الثنائي، يجب أن يكون \[aq]b\[aq] الحرف \fIالثاني\fP في \fImode\fP. وبالتالي، على سبيل المثال، "wb+" له التأثير المطلوب، لكن "w+b" ليس له. هذا غير متسق مع معالجة \fImode\fP بواسطة \fBfopen\fP(3). .P أُزيل الوضع الثنائي في glibc 2.22؛ ليس لـ \[aq]b\[aq] المحدد في \fImode\fP أي تأثير. .SH ملاحظات لا يوجد واصف ملف مرتبط بدفق الملف المُعاد بواسطة هذه الدالة (أي، سيعيد \fBfileno\fP(3) خطأً إذا استُدعي على الدفق المُعاد). .SH العلل .\" http://sourceware.org/bugzilla/show_bug.cgi?id=11216 قبل glibc 2.22، إذا حُدد \fIsize\fP كصفر، يفشل \fBfmemopen\fP() مع الخطأ \fBEINVAL\fP. سيكون أكثر اتساقًا إذا أنشأت هذه الحالة بنجاح دفقًا يعيد بعد ذلك نهاية الملف عند أول محاولة قراءة؛ منذ glibc 2.22، يوفر تنفيذ glibc هذا السلوك. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=13152 قبل glibc 2.22، تحديد وضع الإلحاق ("a" أو "a+") لـ \fBfmemopen\fP() يضبط موضع المخزن المؤقت المبدئي على أول بايت فارغ، لكن (إذا أُعيد ضبط الموضع الحالي إلى موقع غير نهاية الدفق) لا يُجبر عمليات الكتابة اللاحقة على الإلحاق في نهاية الدفق. ثُبت هذا الخطأ في glibc 2.22. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=13151 قبل glibc 2.22، إذا حدد وسيط \fImode\fP لـ \fBfmemopen\fP() الإلحاق ("a" أو "a+")، ولا يغطي وسيط \fIsize\fP بايتًا فارغًا في \fIbuf\fP، فوفقًا لـ POSIX.1\-2008، يجب ضبط موضع المخزن المؤقت المبدئي على البايت التالي بعد نهاية المخزن المؤقت. ومع ذلك، في هذه الحالة يضبط glibc \fBfmemopen\fP() موضع المخزن المؤقت على \-1. ثُبت هذا الخطأ في glibc 2.22. .P .\" https://sourceware.org/bugzilla/show_bug.cgi?id=14292 قبل glibc 2.22، عندما أُجري استدعاء لـ \fBfseek\fP(3) بقيمة \fIwhence\fP من \fBSEEK_END\fP على دفق أُنشئ بواسطة \fBfmemopen\fP()، كان \fIoffset\fP \fIيُطرح\fP من موضع نهاية الدفق، بدلاً من أن يُضاف. ثُبت هذا الخطأ في glibc 2.22. .P .\" http://sourceware.org/bugzilla/show_bug.cgi?id=6544 غيّرت إضافة glibc 2.9 للوضع "الثنائي" لـ \fBfmemopen\fP() ABI بصمت: سابقًا، تجاهل \fBfmemopen\fP() \[aq]b\[aq] في \fImode\fP. .SH أمثلة يستخدم البرنامج أدناه \fBfmemopen\fP() لفتح مخزن إدخال مؤقت، و \fBopen_memstream\fP(3) لفتح مخزن إخراج مؤقت ذي حجم ديناميكي. يمسح البرنامج سلسلة إدخاله (المأخوذة من وسيط سطر الأوامر الأول للبرنامج) لقراءة الأعداد الصحيحة، ويكتب مربعات هذه الأعداد الصحيحة إلى مخزن الإخراج المؤقت. مثال على المخرجات التي ينتجها هذا البرنامج هو التالي: .P .in +4n .EX $\fB ./a.out \[aq]1 23 43\[aq]\fP size=11; ptr=1 529 1849 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (fmemopen.c) \& .EX #define _GNU_SOURCE #include #include #include #include \& int main(int argc, char *argv[]) { FILE *out, *in; int v, s; size_t size; char *ptr; \& if (argc != 2) { fprintf(stderr, "Usage: %s \[aq]...\[aq]\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& in = fmemopen(argv[1], strlen(argv[1]), "r"); if (in == NULL) err(EXIT_FAILURE, "fmemopen"); \& out = open_memstream(&ptr, &size); if (out == NULL) err(EXIT_FAILURE, "open_memstream"); \& for (;;) { s = fscanf(in, "%d", &v); if (s <= 0) break; \& s = fprintf(out, "%d ", v * v); if (s == \-1) err(EXIT_FAILURE, "fprintf"); } \& fclose(in); fclose(out); \& printf("size=%zu; ptr=%s\[rs]n", size, ptr); \& free(ptr); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBfopen\fP(3)، \fBfopencookie\fP(3)، \fBopen_memstream\fP(3) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .