الفرق بين المراجعتين ل"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> <code>length</code> بايتًا (انظر فقرة البنية العامة) من [[Ruby/IO|مجرى د/خ]].
  
إن كان <code>name</code> يبدأ بمحرف التوجيه (<code>"|"</code>)، يتم إنشاء عملية فرعية بطريقة مشابهة للتابع <code>[[Ruby/Kernel/open|Kernel#open]]</code>، وستُعاد مُخرجاتها.
+
يجب أن يكون الوسيط <code>length</code> عددًا صحيحًا غير سلبي أو يكون <code>nil</code>.
  
خيارات
+
إن كان <code>length</code> عددًا صحيحًا موجبًا، سيحاول <code>read</code> قراءة <code>length</code> بايت دون أي تحويل (الوضع الثنائي). يُعيد التابع <code>read</code> القيمة <code>nil</code> إذا تمت مصادفة محرف نهاية الملف (EOF) قبل إيجاد أي شيء يمكن قراءته. سيعاد عدد من البايتات أقل من <code>length</code> إذا تمت مصادفة محرف نهاية الملف (EOF) أثناء القراءة. في حالة كان <code>length</code> عددا صحيحا، سترُمّز [[Ruby/String|السلسلة النصية]] الناتجة دائمًا ب[[Ruby/Encoding|الترميز]] ASCII-8BIT.
<code>[[Ruby//read-label-Options|¶]]</code> <code>[[Ruby//top|]]</code>
 
  
يقبل [[Ruby/Hash|قاموس]] الخياراتopt المفاتيح التالية:
+
إذا تم حذف الوسيط <code>length</code>، أو كان يساوي <code>nil</code>، فسيقرأ التابع <code>read</code> حتى يصادف محرف نهاية الملف EOF، وسيتم تطبيق تحويل الترميز، إن كان ذلك ممكنًا. ستُعاد [[Ruby/String|سلسلة نصية]] حتى لو صودِف محرف نهاية الملف EOF قبل قراءة أي بيانات.
  
:encoding
+
إن كان <code>length</code> يساوي الصفر، فستُعاد [[Ruby/String|سلسلة نصية]] فارغة (<code>""</code>).
  
[[Ruby/String|سلسلة نصية]] أو ترميز
+
في حال إعطاء الوسيط الاختياري <code>outbuf</code> (انظر فقرة البنية العامة)، فينبغي أن يشير إلى [[Ruby/String|سلسلة نصية]] <code>[[Ruby/String|String]]</code>، والتي ستتلقى البيانات. لن يحتوي <code>outbuf</code> إلا البيانات المستلمة بعد استدعاء التابع حتى إذا لم يكن فارغاً في البداية.
  
يحدد ترميز [[Ruby/String|السلسلة النصية]] المقروءة.  سيتم تجاهل <code>:encoding</code> إذا تم تحديد <code>length</code>.  انظر صفحة <code>[[Ruby/Encoding/aliases|Encoding.aliases]]</code> للتعرف على الترميزات الممكنة.
+
عندما يستدعى هذا التابع في نهاية الملف، فسيعيد إما <code>nil</code> أو <code>""</code>، بناءً على الطول <code>length</code>: ستعيد التعبيرات <code>read</code> و <code>read(nil)</code> و <code>read(0)</code> القيمة <code>""</code>، فيما يعيد التعبير <code>read( positive_integer )</code> القيمة <code>nil</code>.
  
:mode
 
  
[[Ruby/String|سلسلة نصية]] أو عدد صحيح
 
  
يحدد الوسيط <code>mode</code> لأجل ادالة open(). ينبغي أن يبدأ بالحرف "r"، وإلا سيتسبب في حدوث خطأ. انظر صفحة <code>[[Ruby/IO/new|::new]]</code> للحصول على قائمة من الأوضاع الممكنة.
+
لاحظ أن هذا التابع يتصرف بطريقة مشابهة للدالة fread()‎ في لغة C. وهذا يعني أنه سيحاول إجراء استدعاءات النظام read(2)‎ لقراءة البيانات بالطول المحدد (أو حتى يصادف محرف نهاية الملف EOF). يتم الاحتفاظ بهذا السلوك حتى لو لم يكن <code>ios</code> في وضع عدم التعطيل (non-blocking mode). (هذا التابع غير حساس لراية عدم التعطيل كغيره من التوابع.) إذا كنت تريد سلوكا مشابها لاستدعاء النظام واحد read(2)‎، فضع في اعتبارك التوابع <code>[[Ruby/IO/readpartial|readpartial]]</code> و <code>[[Ruby/IO/read_nonblock|read_nonblock]]</code> و <code>[[Ruby/IO/sysread|sysread]]</code>.
 
 
‎:open_args
 
 
 
[[Ruby/Array|مصفوفة]]
 
 
 
يحدد الوسائط الممررة إلى open()‎ على هيئة [[Ruby/Array|مصفوفة]].  لا يمكن استخدام هذا المفتاح مع أي من <code>:encoding</code> أو <code>:mode</code>.
 
 
 
أمثلة:
 
 
==البنية العامة==
 
==البنية العامة==
<syntaxhighlight lang="ruby">read(name, [length [, offset]] [, opt] )→ string‎</syntaxhighlight>
+
<syntaxhighlight lang="ruby">read([length [, outbuf]]) → string, outbuf, or nil‎</syntaxhighlight>
 
==المعاملات==
 
==المعاملات==
===<code>name‎</code>===
 
اسم الملف
 
 
===<code>length‎</code>===
 
===<code>length‎</code>===
 
عدد صحيح يمثل الطول
 
عدد صحيح يمثل الطول
===<code>offset‎</code>===
+
===<code>outbuf‎</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 "
+
# read whole file
IO.read("binfile", mode: "rb")  #=> "\xF7\x00\x00\x0E\x12"‎</syntaxhighlight>
+
open("file") do |f|
 +
  data = f.read  # This returns a string even if the file is empty.
 +
  # ...
 +
end
 +
# iterate over fixed length records
 +
open("fixed-record-file") do |f|
 +
  while record = f.read(256)
 +
    # ...
 +
  end
 +
end
 +
# iterate over variable length records,
 +
# each record is prefixed by its 32-bit length
 +
open("variable-record-file") do |f|
 +
  while len = f.read(4)
 +
    len = len.unpack("N")[0]   # 32-bit length
 +
    record = f.read(len)      # This returns a string even if len is 0.
 +
  end
 +
end‎</syntaxhighlight>
 
==انظر أيضا==
 
==انظر أيضا==
* التابع <code>[[Ruby/IO/popen|popen]]</code>: ينفذ التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى [[Ruby/IO|مجرى د/خ]] (<code>IO</code>) المُعاد.
+
* التابع <code>[[Ruby/IO/pwrite|pwrite]]</code>: يكتب [[Ruby/String|السلسلة النصية]] المعطاة (انظر فقرة البنية العامة) في [[Ruby/IO|مجرى د/خ]] <code>ios</code> عند موضع الإزاحة <code>offset</code> باستخدام استدعاء النظام pwrite ()‎.  هذا مفيد مقارنة بالجمع بين <code>[[Ruby/IO/seek|#seek]]</code> و <code>[[Ruby/IO/write|#write]]</code> في كونه ذريًا (atomic)، مما يسمح لعدة [[Ruby/Thread|مهام فرعية]]/عمليات بالتشارك في نفس [[Ruby/IO|مجرى د/خ]] <code>[[Ruby/IO|IO]]</code> لقراءة الملف من مواضع مختلفة. هذا سيتجاوز أي مساحة تخزين مؤقت للمستخدمين من طبقة [[Ruby/IO|مجرى د/خ]] <code>[[Ruby/IO|IO]]</code>. سيعيد عدد البايتات المكتوبة. وسيُطلق الاستثناء <code>SystemCallError</code> في حال حدوث خطأ، أو <code>NotImplementedError</code> إذا لم يكن نظام الشغيل يدعم استدعاء النظام.
* التابع <code>[[Ruby/IO/readlines|readlines]]</code>: يقرأ  كامل الملف المحدد بواسطة <code>name</code> (انظر فقرة البنية العامة) سطرًا سطرًا، ويعيد تلك السطور في [[Ruby/Array|مصفوفة]]. تُفصل السطو بواسطة <code>sep</code>.
+
* التابع <code>[[Ruby/IO/read_nonblock|read_nonblock]]</code>: يقرأ  على الأكثر <code>maxlen</code> (انظر فقرة البنية العامة) بايتًا من [[Ruby/IO|مجرى د/خ]] <code>ios</code> باستخدام استدعاء النظام read(2)‎ بعد تعيين O_NONBLOCK في واصف الملف (file descriptor) الأساسي.
 
==مصادر==
 
==مصادر==
*[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‎ في توثيق روبي الرسمي.]

مراجعة 17:01، 13 نوفمبر 2018

يقرأ التابع read length بايتًا (انظر فقرة البنية العامة) من مجرى د/خ.

يجب أن يكون الوسيط length عددًا صحيحًا غير سلبي أو يكون nil.

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

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

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

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

عندما يستدعى هذا التابع في نهاية الملف، فسيعيد إما nil أو ""، بناءً على الطول length: ستعيد التعبيرات read و read(nil) و read(0) القيمة ""، فيما يعيد التعبير read( positive_integer ) القيمة nil.


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

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

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

المعاملات

length‎

عدد صحيح يمثل الطول

outbuf‎

سلسلة نصية تتلقى البيانات

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

أمثلة

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

f = File.new("testfile")
f.read(16)   #=> "This is line one"
# read whole file
open("file") do |f|
  data = f.read   # This returns a string even if the file is empty.
  # ...
end
# iterate over fixed length records
open("fixed-record-file") do |f|
  while record = f.read(256)
    # ...
  end
end
# iterate over variable length records,
# each record is prefixed by its 32-bit length
open("variable-record-file") do |f|
  while len = f.read(4)
    len = len.unpack("N")[0]   # 32-bit length
    record = f.read(len)       # This returns a string even if len is 0.
  end
end

انظر أيضا

  • التابع pwrite: يكتب السلسلة النصية المعطاة (انظر فقرة البنية العامة) في مجرى د/خ ios عند موضع الإزاحة offset باستخدام استدعاء النظام pwrite ()‎. هذا مفيد مقارنة بالجمع بين #seek و #write في كونه ذريًا (atomic)، مما يسمح لعدة مهام فرعية/عمليات بالتشارك في نفس مجرى د/خ IO لقراءة الملف من مواضع مختلفة. هذا سيتجاوز أي مساحة تخزين مؤقت للمستخدمين من طبقة مجرى د/خ IO. سيعيد عدد البايتات المكتوبة. وسيُطلق الاستثناء SystemCallError في حال حدوث خطأ، أو NotImplementedError إذا لم يكن نظام الشغيل يدعم استدعاء النظام.
  • التابع read_nonblock: يقرأ على الأكثر maxlen (انظر فقرة البنية العامة) بايتًا من مجرى د/خ ios باستخدام استدعاء النظام read(2)‎ بعد تعيين O_NONBLOCK في واصف الملف (file descriptor) الأساسي.

مصادر