التابع IO.read
في روبي
يقرأ التابع 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) الأساسي.