الفرق بين المراجعتين ل"Ruby/IO/read-i"

من موسوعة حسوب
< Ruby‏ | IO
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>IO.read‎</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Method [[تصنيف: Ruby IO]...')
 
ط (تدقيق)
 
(مراجعتان متوسطتان بواسطة مستخدم واحد آخر غير معروضتين)
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby IO]]
 
[[تصنيف: Ruby IO]]
يفتح التابع <code>read</code> الملف، ثم يتموضع اختياريا في الموضع المعطى <code>offset</code> (انظر فقرة البنية العامة)، ثم يُعيد <code>length</code> بايت (تساوي قيمته الافتراضية طول بقية الملف).  يضمن التابع <code>read</code> أن يُغلق الملف قبل العودة.
+
يقرأ التابع <code>read</code> عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه
  
إن كان <code>name</code> يبدأ بمحرف التوجيه (<code>"|"</code>)، يتم إنشاء عملية فرعية بطريقة مشابهة للتابع <code>[[Ruby/Kernel/open|Kernel#open]]</code>، وستُعاد مُخرجاتها.
+
عندما يُستدعى التابع <code>read</code> في نهاية الملف، فسيعيد إما <code>nil</code> أو <code>""</code>، بناءً على الطول المُمرَّر إليه، مثلا، ستعيد التعبيرات <code>read</code> و <code>read(nil)‎</code> و <code>read(0)‎</code> القيمة <code>""</code>، فيما سيعيد التعبير <code>read( positive_integer )‎</code> القيمة <code>nil</code>.
  
خيارات
+
لاحظ أنَّ هذا التابع يتصرف بطريقة مشابهة للدالة <code>fread()‎</code> في لغة [[C]]. وهذا يعني أنَّه سيحاول إجراء استدعاءات النظام <code>read(2)‎</code> لقراءة البيانات بالطول المحدَّد (أو حتى يصادف محرف نهاية الملف <code>EOF</code>). يستمر هذا السلوك حتى لو لم يكن [[Ruby/IO|المجرى]] في وضع عدم التعطيل (non-blocking mode). (هذا التابع غير حساس لراية عدم التعطيل كغيره من التوابع.) إذا كنت تريد سلوكًا مشابهًا لاستدعاء النظام <code>read(2)‎</code>، فضع في اعتبارك  استخدام التوابع <code>[[Ruby/IO/readpartial|readpartial]]</code> و <code>[[Ruby/IO/read_nonblock|read_nonblock]]</code> و <code>[[Ruby/IO/sysread|sysread]]</code>.
<code>[[Ruby//read-label-Options|]]</code> <code>[[Ruby//top|]]</code>
+
==البنية العامة==
 
+
<syntaxhighlight lang="ruby">read([length [, outbuf]]) → string, outbuf, or nil‎</syntaxhighlight>
يقبل [[Ruby/Hash|قاموس]] الخياراتopt المفاتيح التالية:
+
==المعاملات==
 
+
===<code>length‎</code>===
:encoding
+
[[Ruby/Integer|عدد صحيح]] موجب يمثل عدد البايتات المراد قراءتها دون أي تحويل (الوضع الثنائي) من المجرى. يمكن أن يأخذ القيمة <code>nil</code>. في حالة كان <code>length</code> عددًا صحيحًا، ستُرمّز [[Ruby/String|السلسلة النصية]] المعادة دائمًا ب[[Ruby/Encoding|الترميز]] <code>ASCII-8BIT</code>.
 
 
[[Ruby/String|سلسلة نصية]] أو ترميز
 
 
 
يحدد ترميز [[Ruby/String|السلسلة النصية]] المقروءة. سيتم تجاهل <code>:encoding</code> إذا تم تحديد <code>length</code>.  انظر صفحة <code>[[Ruby/Encoding/aliases|Encoding.aliases]]</code> للتعرف على الترميزات الممكنة.
 
  
:mode
+
إذا تم حذف المعامل <code>length</code> أو كان يساوي <code>nil</code>، فسيقرأ التابع <code>read</code> جميع محتويات المجرى حتى يصادف محرف نهاية الملف <code>EOF</code>، وسيتم تطبيق تحويل الترميز إن كان ذلك ممكنًا. ستُعاد [[Ruby/String|سلسلة نصية]] فارغة لو صودِف محرف نهاية الملف قبل قراءة أي بيانات.
  
[[Ruby/String|سلسلة نصية]] أو عدد صحيح
+
إن كان <code>length</code> يساوي الصفر، فستُعاد [[Ruby/String|سلسلة نصية]] فارغة (<code>""</code>).
 +
===<code>outbuf‎</code>===
 +
في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى [[Ruby/String|السلسلة النصية]] التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي <code>outbuf</code> إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا).
 +
==القيمة المعادة==
 +
تعاد [[Ruby/String|السلسلة النصية]] المقروءة من المجرى المعطى والتي تكون بالحجم <code>length</code> بايت تمامًا، أو تعاد سلسلة نصية أقل من الحجم <code>length</code> إن عُثِرَ على محرف نهاية الملف (EOF)، أو تعاد القيمة <code>nil</code>  عند الوصول إلى نهاية الملف (EOF) دون العثور على أي شيء يُقرَأ، أو [[Ruby/String|سلسلة نصية]] فارغة (<code>""</code>)  بناءً على قيمة الطول <code>length</code>
  
يحدد الوسيط <code>mode</code> لأجل ادالة open()‎.  ينبغي أن يبدأ بالحرف "r"، وإلا سيتسبب في حدوث خطأ. انظر صفحة <code>[[Ruby/IO/new|::new]]</code> للحصول على قائمة من الأوضاع الممكنة.
 
 
‎:open_args
 
 
[[Ruby/Array|مصفوفة]]
 
 
يحدد الوسائط الممررة إلى open()‎ على هيئة [[Ruby/Array|مصفوفة]].  لا يمكن استخدام هذا المفتاح مع أي من <code>:encoding</code> أو <code>:mode</code>.
 
 
أمثلة:
 
==البنية العامة==
 
<syntaxhighlight lang="ruby">read(name, [length [, offset]] [, opt] )→ string‎</syntaxhighlight>
 
==المعاملات==
 
===<code>name‎</code>===
 
اسم الملف
 
===<code>length‎</code>===
 
عدد صحيح يمثل الطول
 
===<code>offset‎</code>===
 
عدد صحيح يمثل الإزاحة
 
===<code>opt‎</code>===
 
خيارات
 
==القيمة المُعادة==
 
 
==أمثلة==
 
==أمثلة==
 
مثال على استخدام التابع <code>read‎</code>:
 
مثال على استخدام التابع <code>read‎</code>:
<syntaxhighlight lang="ruby">IO.read("testfile")             #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
+
<syntaxhighlight lang="ruby">f = File.new("testfile")
IO.read("testfile", 20)         #=> "This is line one\nThi"
+
f.read(16)  #=> "This is line one"
IO.read("testfile", 20, 10)     #=> "ne one\nThis is line "
+
# قراءة الملف بأكمله
IO.read("binfile", mode: "rb"#=> "\xF7\x00\x00\x0E\x12"‎</syntaxhighlight>
+
open("file") do |f|
==انظر أيضا==
+
  data = f.read  # هذا سيعيد سلسلة نصية حتى لو كان الملف فارغًا
* التابع <code>[[Ruby/IO/popen|popen]]</code>: ينفذ  التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى [[Ruby/IO|مجرى د/خ]] (<code>IO</code>) المُعاد.
+
  # ...
* التابع <code>[[Ruby/IO/readlines|readlines]]</code>: يقرأ كامل الملف المحدد بواسطة <code>name</code> (انظر فقرة البنية العامة) سطرًا سطرًا، ويعيد تلك السطور في [[Ruby/Array|مصفوفة]]. تُفصل السطو بواسطة <code>sep</code>.
+
end
 +
# التكرار عبر حجم ثابت من البيانات
 +
open("fixed-record-file") do |f|
 +
  while record = f.read(256)
 +
    # ...
 +
  end
 +
end
 +
# التكرار عبر حجم متغير من البيانات
 +
# ستُلحَق كل كتلة من البيانات بالطول 32 بت الخاص بها
 +
open("variable-record-file") do |f|
 +
  while len = f.read(4)
 +
    len = len.unpack("N")[0]  # الطول 32 بت
 +
    record = f.read(len)     # يساوي 0 len هذا سيعيد سلسلة نصية حتى لو كان
 +
   end
 +
end‎</syntaxhighlight>
 +
==انظر أيضًا==
 +
* التابع [[Ruby/IO/pread|<code>pread</code>]]: يقرأ من المجرى الذي استدعي معه عددًا محدَّدًا من البايتات باستخدام استدعاء النظام <code>pread</code>، ثم يُعيدها ك[[Ruby/String|سلسلة نصية]] من غير تعديل إزاحة (offset) الواصف الأساسي.
 +
 
 +
* التابع <code>[[Ruby/IO/read_nonblock|read_nonblock]]</code>: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استُدعي معه باستخدام استدعاء النظام <code>read(2)‎</code> بعد تعيين الراية <code>O_NONBLOCK</code> لواصف الملف (file descriptor) الأساسي.
 +
* التابع [[Ruby/IO/readbyte|<code>readbyte</code>]]: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه.
 +
* التابع [[Ruby/IO/readchar|<code>readchar</code>]]: يقرأ محرفًا واحدًا من [[Ruby/IO|المجرى]] الذي استدعي معه.  
 +
* التابع [[Ruby/IO/readline|<code>readline</code>]]: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه.
 +
* التابع [[Ruby/IO/readlines-i|<code>readlines</code>]]: يقرأ كل الأسطر الموجودة في [[Ruby/IO|المجرى]] الذي استدعي معه ثم يعيدها في [[Ruby/Array|مصفوفة]]. 
 +
* التابع [[Ruby/IO/readpartial|<code>readpartial</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه.  
 +
* التابع [[Ruby/IO/write-i|<code>write</code>]]: يكتب [[Ruby/String|السلاسل النصية]] المُمرَّرة إليه في [[Ruby/IO|المجرى]] الذي استدعي معه.  
 
==مصادر==
 
==مصادر==
*[http://ruby-doc.org/core-2.5.1/IO.html#method-c-read قسم التابع read‎ في الصنف IO‎ في توثيق روبي الرسمي.]
+
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-read قسم التابع read‎ في الصنف IO‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 08:35، 23 ديسمبر 2018

يقرأ التابع read عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه

عندما يُستدعى التابع read في نهاية الملف، فسيعيد إما nil أو ""، بناءً على الطول المُمرَّر إليه، مثلا، ستعيد التعبيرات read و read(nil)‎ و read(0)‎ القيمة ""، فيما سيعيد التعبير read( positive_integer )‎ القيمة nil.

لاحظ أنَّ هذا التابع يتصرف بطريقة مشابهة للدالة fread()‎ في لغة C. وهذا يعني أنَّه سيحاول إجراء استدعاءات النظام read(2)‎ لقراءة البيانات بالطول المحدَّد (أو حتى يصادف محرف نهاية الملف EOF). يستمر هذا السلوك حتى لو لم يكن المجرى في وضع عدم التعطيل (non-blocking mode). (هذا التابع غير حساس لراية عدم التعطيل كغيره من التوابع.) إذا كنت تريد سلوكًا مشابهًا لاستدعاء النظام read(2)‎، فضع في اعتبارك استخدام التوابع readpartial و read_nonblock و sysread.

البنية العامة

read([length [, outbuf]])  string, outbuf, or nil

المعاملات

length‎

عدد صحيح موجب يمثل عدد البايتات المراد قراءتها دون أي تحويل (الوضع الثنائي) من المجرى. يمكن أن يأخذ القيمة nil. في حالة كان length عددًا صحيحًا، ستُرمّز السلسلة النصية المعادة دائمًا بالترميز ASCII-8BIT.

إذا تم حذف المعامل length أو كان يساوي nil، فسيقرأ التابع read جميع محتويات المجرى حتى يصادف محرف نهاية الملف EOF، وسيتم تطبيق تحويل الترميز إن كان ذلك ممكنًا. ستُعاد سلسلة نصية فارغة لو صودِف محرف نهاية الملف قبل قراءة أي بيانات.

إن كان length يساوي الصفر، فستُعاد سلسلة نصية فارغة ("").

outbuf‎

في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى السلسلة النصية التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي outbuf إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا).

القيمة المعادة

تعاد السلسلة النصية المقروءة من المجرى المعطى والتي تكون بالحجم length بايت تمامًا، أو تعاد سلسلة نصية أقل من الحجم length إن عُثِرَ على محرف نهاية الملف (EOF)، أو تعاد القيمة nil عند الوصول إلى نهاية الملف (EOF) دون العثور على أي شيء يُقرَأ، أو سلسلة نصية فارغة ("") بناءً على قيمة الطول length

أمثلة

مثال على استخدام التابع read‎:

f = File.new("testfile")
f.read(16)   #=> "This is line one"
# قراءة الملف بأكمله
open("file") do |f|
  data = f.read   # هذا سيعيد سلسلة نصية حتى لو كان الملف فارغًا
  # ...
end
# التكرار عبر حجم ثابت من البيانات
open("fixed-record-file") do |f|
  while record = f.read(256)
    # ...
  end
end
# التكرار عبر حجم متغير من البيانات
# ستُلحَق كل كتلة من البيانات بالطول 32 بت الخاص بها
open("variable-record-file") do |f|
  while len = f.read(4)
    len = len.unpack("N")[0]  # الطول 32 بت
    record = f.read(len)      # يساوي 0 len هذا سيعيد سلسلة نصية حتى لو كان 
  end
end

انظر أيضًا

  • التابع pread: يقرأ من المجرى الذي استدعي معه عددًا محدَّدًا من البايتات باستخدام استدعاء النظام pread، ثم يُعيدها كسلسلة نصية من غير تعديل إزاحة (offset) الواصف الأساسي.
  • التابع read_nonblock: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استُدعي معه باستخدام استدعاء النظام read(2)‎ بعد تعيين الراية O_NONBLOCK لواصف الملف (file descriptor) الأساسي.
  • التابع readbyte: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه.
  • التابع readchar: يقرأ محرفًا واحدًا من المجرى الذي استدعي معه.
  • التابع readline: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه.
  • التابع readlines: يقرأ كل الأسطر الموجودة في المجرى الذي استدعي معه ثم يعيدها في مصفوفة
  • التابع readpartial: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.
  • التابع write: يكتب السلاسل النصية المُمرَّرة إليه في المجرى الذي استدعي معه.

مصادر