क्या हो रहा है यह नहीं है कि कोड क्रम से बाहर हो रहा है, लेकिन यह संकेत तुरंत टर्मिनल पर प्रदर्शित नहीं हो रहा है।
आंतरिक रूप से, आपके द्वारा आउटपुट की जाने वाली किसी भी चीज़ को ऑपरेटिंग सिस्टम द्वारा आईओ बफर में संग्रहीत किया जाता है। समय-समय पर, बफर खाली हो जाता है और इसकी सामग्री टर्मिनल पर प्रदर्शित होती है (यह फ्लश) है। अधिकांश प्रणालियों पर, टर्मिनल लाइन डिफ़ॉल्ट रूप से buffered है, जिसका अर्थ है कि हर बार जब आप एक अंतराल के चरित्र लिखते हैं - जो print()
स्वचालित रूप से होता है - यह फ़्लश हो जाता है; कुछ प्रणालियों पर, हालांकि, यह होने के लिए डिफ़ॉल्ट रूप से बफर किया गया है, जिसका अर्थ है कि यह स्वचालित रूप से भरने पर ही स्वचालित रूप से फ़्लश हो जाता है।
आप इसे संबोधित करने के दो तरीके हैं। यदि आप फ़ाइल पर सभी आईओ संचालन के लिए बफरिंग को अक्षम या परिवर्तित करना चाहते हैं (और इन उद्देश्यों के लिए, टर्मिनल फ़ाइल के रूप में गिना जाता है), तो आप file:setvbuf()
फ़ंक्शन का उपयोग कर सकते हैं; विशेष रूप से, io.output():setvbuf("no")
मानक आउटपुट के लिए बफरिंग अक्षम कर देगा, जिसका अर्थ है कि आप जो कुछ भी लिखते हैं उसे तत्काल प्रदर्शित किया जाएगा। आप लाइन बफरिंग को सक्षम करने के लिए io.output():setvbuf("line")
का उपयोग भी कर सकते हैं, सिस्टम पर जहां समर्थित है लेकिन डिफ़ॉल्ट नहीं है।
दूसरा दृष्टिकोण बफर को मैन्युअल रूप से फ़्लश करना है, जो उपयोगी है जब आप कुछ विशेष आउटपुट तुरंत प्रदर्शित करना चाहते हैं, लेकिन सार्वभौमिक आउटपुट बफरिंग अक्षम नहीं करना चाहते हैं। उदाहरण के लिए आप file:flush()
समारोह है, जो तुरंत बफर flushes के साथ ऐसा कर सकते हैं,:
-- no newline, so even on line-buffered systems this may not
-- display immediately
io.write("Enter a number: ")
-- so we force it to
io.flush()
ध्यान दें कि io.write()
और io.flush()
io.output():write()
और io.output():flush()
के लिए बस सुविधा कार्य हैं, यानी वे वर्तमान आउटपुट फ़ाइल और फिर :write()
फोन या :flush()
उन पर।
(क्यों बफरिंग से परेशान है? क्योंकि यह तेज़ है - टर्मिनल या फ़ाइल में डेटा लिखना महंगा है, और एक बड़ी चीज लिखना बहुत छोटी चीजें लिखने से तेज़ है। ज्यादातर मामलों में, इससे कोई फर्क नहीं पड़ता यदि चीजें बहुत तेज़ी से लिखी नहीं जाती हैं तो कोड चलता है, इसलिए ओएस डेटा को बफर में लिखा जाता है और फिर बफर भरने पर एक बड़ा लिखता है।)
'io.stdout: setvbuf आज़माएं आपके कार्यक्रम की शुरुआत में 'नहीं'। –
@EgorSkriptunoff ठीक से काम करने लगता है। इसे उत्तर देने के लिए स्वतंत्र महसूस करें। –
आप बहुत अधिक पूछ रहे हैं :-) –