2012-10-16 12 views
9

रूबी में एक फ़ाइल को पढ़ने/पकाने के लिए मैं इसे फिर से खोलने के बिना फ़ाइल के "पॉइंटर" को रीसेट कर सकता हूं?एक बार

f=open('test') => #<File:test> 
f.grep(/llo/) => ["Hello world\n"] 
f.grep(/wo/) => [] 

यह फ़ाइल को फिर से खोलने के बिना f पुनर्स्थापित करने के लिए संभव है: (? सी में fseek तरह)

उदाहरण के लिए, मैं एक फ़ाइल है कि मैं दो पैटर्न के लिए grep करना चाहते हैं?

नोट: मैं कामकाज की तलाश नहीं कर रहा हूं; मैं कुछ अपने बारे में सोच सकता हूं;)।

उत्तर

15

उपयोग rewind

पदों इनपुट की शुरुआत करने के लिए ios, शून्य करने के लिए lineno को रीसेट।

f = File.new("testfile") 
f.readline #=> "This is line one\n" 
f.rewind  #=> 0 
f.lineno  #=> 0 
f.readline #=> "This is line one\n" 
4

IO वर्ग के लिए माणिक डॉक्स पर एक नजर डालें। धारा रीसेट करने के लिए:

f.pos = 0 

या

f.seek 0 

ध्यान दें कि आप इन विधियों के साथ एक मनमाना बाइट स्थिति के लिए धारा सेट कर सकते हैं, लेकिन सावधान रहना है, तो फ़ाइल multibyte वर्ण हैं।

युक्ति: File.ancestors आप विरासत श्रृंखला बता देंगे ताकि आप तरीकों को पूरा हो सकता है कि आप क्या चाहते हैं (लेकिन आप कभी कभी सिंगलटन तरीकों और method_missing के लिए और अधिक उन्नत प्रतिबिंब क्या करना है) देख सकते हैं।

अद्यतन:

Megas 'जवाब क्लीनर हो सकता है क्योंकि rewind भी lineno रीसेट करता है। grep का आउटपुट lineno के मान से प्रभावित नहीं है, लेकिन lineno इसे रीसेट होने तक तेजी से गलत हो जाएगा। यदि आपको lineno पर परवाह नहीं है, तो आप सुरक्षित रूप से हमारे किसी भी समाधान का उपयोग कर सकते हैं।