2011-01-25 17 views
11

मैं सी में एक टेक्स्ट एडिटर करने की योजना बना रहा हूं। तो बस यह जानना चाहता था कि पाठ को बचाने के लिए कौन सी डेटा संरचना अच्छी है। मैंने लिंक की गई सूची का उपयोग करके इसे पढ़ने का एक तरीका था, लेकिन कुशल नहीं। कृपया मुझे कुछ संदर्भों पर इंगित करें जहां मुझे उपयोग करने की आवश्यकता के बारे में एक अच्छा विचार मिल सकता है। मैं उपयोगकर्ता इनपुट और कैप्चरिंग कुंजी और यूआई प्राप्त करने के लिए ncurses लाइब्रेरी का उपयोग करने की योजना बना रहा हूं।टेक्स्ट एडिटर लिखते समय डेटा को सहेजने का अच्छा तरीका

मौजूदा संपादकों के स्रोत कोड का उपयोग करना बहुत जटिल है, सभी पाठ संपादक विशाल हैं, यहां तक ​​कि केवल कंसोल ही कंसोलर हैं। संदर्भ के लिए कोई सरल कंसोल संपादक स्रोत कोड?

+0

आपको * स्टोर * डेटा के लिए एक अच्छा तरीका लगता है, क्योंकि इसे सहेजने से इसे फ़ाइल में लिखना है (जो आपके प्रोग्राम में किसी भी डेटा संरचना को शामिल नहीं करता है और इसमें शामिल नहीं होना चाहिए)। (हालांकि अच्छा सवाल है।) –

+0

वाह ... मैं सचमुच कल इस प्रश्न के बारे में सोच रहा था। मेरे दिमाग को पढ़ने के लिए +1। – Tesserex

+1

आप 'ed' (मानक टेक्स्ट एडिटर) पर एक नज़र डाल सकते हैं। 'ed' लाइन उन्मुख है और इसके आंतरिक बहुत सरल होना चाहिए। और विनोद की भावना वाले लोगों के लिए: http://www.gnu.org/fun/jokes/ed.msg.html –

उत्तर

8

आपको reading about Emacs buffers से लाभ होगा। इसके अलावा this blog देखते हैं, विशेष रूप से अंतिम टिप्पणी है, यहाँ आसान संदर्भ के लिए उद्धृत किया:

Emacs के कई संस्करण, जीएनयू सहित, एक भी सन्निहित चरित्र सरणी लगभग एक अंतराल के द्वारा अलग दो वर्गों में विभाजित का उपयोग करें। अंतर डालने के लिए पहले प्रविष्टि बिंदु पर ले जाया गया है। सम्मिलित वर्ण अंतराल को भरते हैं, इसके आकार को कम करते हैं। यदि पात्रों को पकड़ने के लिए अपर्याप्त जगह है तो पूरे बफर को एक नए बड़े आकार में पुन: आवंटित किया जाता है और पिछले सम्मिलन बिंदु पर अंतराल को अंतराल दिया जाता है।

इस पर बेवकूफ देखो और कहें कि शामिल सभी प्रतिलिपि के कारण प्रदर्शन खराब होना चाहिए। गलत। कॉपी ऑपरेशन अविश्वसनीय रूप से तेज़ है और इसे विभिन्न तरीकों से अनुकूलित किया जा सकता है। गैप बफर भी उपयोग पैटर्न का लाभ लेते हैं। टेक्स्ट को फोकस करने और डालने से पहले आप पूरी खिड़की पर कूद सकते हैं। अंतर प्रदर्शन के लिए नहीं चलता है - केवल डालने के लिए (या हटाएं)।

दूसरी तरफ, 500 एमबी फ़ाइल के सिर पर एक चरित्र ब्लॉक डालने के बाद अंत में एक और डालना अंतराल दृष्टिकोण के लिए सबसे खराब मामला है, खासकर अगर अंतराल का आकार पार हो गया हो। किस नियमित अंतराल पर वह घटित होता है?

वर्चुअल मेमोरी वातावरण में संगत मेमोरी ब्लॉक का मूल्य निर्धारण किया जाता है क्योंकि कम पेजिंग शामिल है। इसके अलावा, पढ़ता है और लिखना सरल होता है क्योंकि फ़ाइल को किसी अन्य डेटा संरचना में पार्स और टूटा नहीं होना चाहिए। इसके बजाय, अंतराल बफर में फ़ाइल का आंतरिक प्रतिनिधित्व डिस्क के समान होता है और इसे पढ़ा और बेहतर ढंग से लिखा जा सकता है। खुद को एक सिस्टम कॉल (* निक्स पर) के साथ किया जा सकता है।

अंतर बफर सामान्य रूप से पाठ को संपादित करने के लिए सबसे अच्छा एल्गोरिदम है। यह कम से कम स्मृति का उपयोग करता है और विभिन्न उपयोग मामलों पर उच्चतम प्रदर्शन करता है। एक दृश्य खिड़की के लिए अंतर बफर का अनुवाद थोड़ा सा ट्रिकियर है क्योंकि लाइन संदर्भ को लगातार बनाए रखा जाना चाहिए।

+0

बहुत बढ़िया लिंक, मुझे आशा है कि आपको संपादन पर ध्यान नहीं दिया जाएगा। –

+2

दावा है कि अंतराल एल्गोरिदम सबसे अच्छा है, जो कि दशकों तक एमएक्स के प्रशंसकों द्वारा कायम रखा गया है। मैं एक emacs प्रशंसक हूँ, लेकिन दावा अभी भी बकवास है। "रस्सियों" दृष्टिकोण, पत्तियों में एकल पात्रों की बजाय चरित्र सरणी वाले बाइनरी पेड़ के साथ, सैद्धांतिक दृष्टिकोण से स्पष्ट रूप से इष्टतम होता है, और यदि आप केवल पत्ती के आकार को पर्याप्त बढ़ाते हैं, तो किसी भी अप्रिय निरंतर कारकों को मनमाने ढंग से छोटा बनाया जा सकता है। –

+1

@ आर .. मुझे शक नहीं है, हालांकि यह एक काफी सरल संरचना है जो अधिकांश लोगों की जरूरतों को पूरा करेगी। मैं पाठ संपादन के लिए किसी नए व्यक्ति को कुछ सरल और सीधा लागू करने पर विचार करने की सलाह दूंगा, फिर प्रदर्शन को मापने के लिए यह देखने के लिए कि अतिरिक्त विकास और परीक्षण समय की आवश्यकता है या नहीं। "समयपूर्व अनुकूलन ..." और वह सब। –

3

यदि आप इसे स्केल करना चाहते हैं, तो आपको संतुलित बाइनरी पेड़ का एक रूप उपयोग करना चाहिए। इसे मूल रूप से सभी संचालन करना संभव है - डालें, हटाएं, चरित्र की तलाश करें, लाइन की तलाश करें, आदि - O(log n) हैं। यदि आप केवल पाठ के लिए "sane" फ़ाइल आकार (कुछ मेग्स अधिकतम) के बारे में परवाह करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप किस संरचना का उपयोग करते हैं।

+0

धन्यवाद आर .. सबसे पहले मैं छोटा शुरू करना चाहता हूं ... इसे सबसे अच्छा संभव तरीका का उपयोग करके काम कर रहा हूं बस मुझे मामले में स्केलिंग जैसा लगता है .... – yaami

1

यह link अच्छा जानकारी प्रदान करता है - के एक "क्या-यू-देखें-Is-क्या-यू-जाओ" (या "WYSIWYG") दस्तावेज़ संपादक

1

आप "बचाने" चाहिए डिजाइन में एक मामले का अध्ययन सादा पाठ के रूप में डेटा। यदि आपका मतलब स्मृति में डेटा को स्टोर करना है, तो मैं एक साधारण लिंक्ड सूची की अनुशंसा करता हूं।

यदि यह सिर्फ एक टेक्स्ट एडिटर (वर्ड प्रोसेसर नहीं) है, तो मैंने जो दृष्टिकोण लिया वह प्रत्येक लाइन को अपने स्वयं के लिंक नोड में स्टोर करना था।

यह एक अच्छा आसान तरीका है जो लाइनों को सम्मिलित करना और हटाना आसान बनाता है।और पाठ डालना या हटाना कुशल है क्योंकि पाठ को डालने या हटाने के दौरान वर्तमान नोड के भीतर केवल डेटा को स्थानांतरित करने की आवश्यकता होती है।

आपने कहा कि आप स्रोत कोड देखना नहीं चाहते हैं, फिर भी, आप एक साधारण पाठ संपादक को देखने के लिए pictor.zip डाउनलोड करके कई वर्षों पहले http://www.softcircuits.com/sw_dos.aspx पर लिखे गए संस्करण को डाउनलोड कर सकते हैं।

+0

स्रोत जोनाथन के लिए धन्यवाद। मैं सोर्स कोड नहीं देखना चाहता था क्योंकि क्या हो रहा है यह समझने के लिए अधिकांश संपादक बहुत जटिल हैं (कम से कम मेरे लिए)। लेकिन अच्छे और सरल उदाहरण हमेशा जीवन बचतकर्ता होते हैं। मैं आपके द्वारा प्रदान किए गए कोड को देखूंगा, छोटा और अच्छा लगता है :) – yaami

1

(बहुत पुरानी) पुस्तक Software Tools in Pascal एक पूरा एड शैली (लगता है vim) पाठ संपादक, regexp खोज/शामिल की जगह लागू करता है। यह संपादित पाठ को पकड़ने के लिए सरणी का उपयोग करता है।

संबंधित मुद्दे