सारांश
यह पाठ पाठ्यक्रम की सातवीं इकाई खोलता है, जो टेक्स्ट और फ़ाइलों को समर्पित है। यह समझाता है कि इकाई किसलिए है: टेक्स्ट को उसकी वास्तविक एन्कोडिंग के साथ डेटा के रूप में बरतना सिखाना, और ऐसे प्रोग्राम बनाना जो खराब फ़ॉर्मेट वाले इनपुट के सामने ढहे बिना फ़ाइलें पढ़ें और लिखें; इकाई के चार पाठ और उन्हें जोड़ने वाला सूत्र प्रस्तुत करता है; याद दिलाता है कि इकाई क्या पहले से ज्ञात मानती है, ख़ास तौर पर यह कि मशीन के लिए एक वर्ण एक संख्या है, और इकाई 5 और 6 के वेक्टर, रिकॉर्ड और फ़ंक्शन; उस समस्या को सामने रखता है जिसे इकाई हल करती है, यानी ऐसा प्रोग्राम जो सही दिखता है पर बिना चेतावनी के डेटा खो देता है, पहली अप्रत्याशित पंक्ति पर रुक जाता है और ASCII से बाहर के वर्णों वाले नामों को गलत मापता है; पहले से बताता है कि एक अक्षर हमेशा एक बाइट नहीं लेता; और दिखाता है कि इकाई कहाँ ले जाती है, इकाई 8 में और C++ में प्रोग्रामिंग II पाठ्यक्रम में।
अधिगम उद्देश्य
- इकाई की विषय-वस्तु के क्रम का वर्णन करना और समझाना कि हर पाठ अपने बाद वाले पाठ को क्या देता है।
- वर्णों के संख्यात्मक कोड के रूप में निरूपण (पाठ 2.4) को याद करना और किसी कोड को द्विआधारी और षोडशआधारी में लिखना।
- एक उदाहरण के सहारे पहले से समझ लेना कि एक अक्षर हमेशा एक बाइट नहीं होता, और इसलिए बाइट गिनना अक्षर गिनना नहीं है।
- पहचानना कि इकाई पूरी करने पर क्या कर पाना अपेक्षित है, और उसे उससे अलग करना जो आगे की इकाई में और C++ में प्रोग्रामिंग II में सीखा जाएगा।
प्रवेश मूल्यांकन
इकाई शुरू करने से पहले आरंभ-बिंदु को माप लेना उपयोगी है। यह मूल्यांकन एक स्व-मूल्यांकन है: इसमें अंक नहीं दिए जाते, और इसका एकमात्र उद्देश्य अध्ययन को दिशा देना है। पहले छह प्रश्न उसे जाँचते हैं जिसे इकाई ज्ञात मानती है: किसी वर्ण का कोड, किसी संख्या को द्विआधारी और षोडशआधारी में लिखना, बिट मास्क, अपने तत्वों को छाँटने वाला वेक्टर का ट्रैवर्सल, संख्या की जगह अक्षर मिलने पर पढ़ने के साथ क्या होता है, और रिकॉर्ड की परिभाषा। उसके बाद के चार प्रश्न, पाठों के क्रम में, इकाई के केंद्रीय विचारों को छूते हैं: कुछ न पाने वाली खोज क्या लौटाती है, ASCII से बाहर के अक्षर वाले शब्द का आकार, पढ़ने के दो तरीक़ों को मिलाने पर दिखने वाली खाली पंक्ति, और वह फ़ाइल जो खोली नहीं जा सकी। इन चार का सही उत्तर अभी देना किसी के लिए ज़रूरी नहीं, और कुछ में “मुझे अभी नहीं पता” एक ईमानदार उत्तर है: हर उत्तर, सही हो या ग़लत, बात को समझाता है और उस पाठ का नाम बताता है जिसमें वह बात आती है। यही कौशल अंत में, सारांश वाले पाठ में, फिर से मापे जाते हैं।
इकाई शुरू करने से पहले अपना आरंभ बिंदु मापें। यह एक छोटा स्व-मूल्यांकन है: इस पर अंक नहीं दिए जाते और इसका परिणाम केवल आपके ब्राउज़र में रहता है।
प्रश्न 1पिछली इकाइयों से
std::println("{:d} {:d}", 'A', 'a');क्या लिखता है?मानता है कि छोटे अक्षर बड़े अक्षरों के ठीक बाद आते हैं; दोनों के बीच 32 कोड हैं, जिनके बीच कुछ चिह्न भी हैं।अनदेखा करता है कि{:d}कोड माँगता है; उसके बिनाstd::printlnअक्षर लिखता।क्रम उलट देता है: ASCII में बड़े अक्षरों के कोड छोटे अक्षरों के कोड से छोटे हैं।एकcharएक संख्या रखता है, वर्ण का कोड, और{:d}अक्षर के बजाय वही संख्या लिखने को कहता है। ASCII में बड़े अक्षर 65 से और छोटे अक्षर 97 से शुरू होते हैं: अंतर 32 है, यानी केवल एक बिट। पाठ टेक्स्ट ASCII नहीं है यहीं से शुरू करके समझाता है कि जो अक्षर ASCII में नहीं हैं उनके साथ क्या होता है।दोहराएँ: वर्ण, बूलियन, रूपांतरण और स्थिरांक
प्रश्न 2पिछली इकाइयों से233 को द्विआधारी और षोडशआधारी में कैसे लिखते हैं?
निचले चार बिटों का समूह ग़लत बनाता है:10019 है, 1 नहीं।बिटों को उलटा पढ़ता है, सबसे कम महत्त्व वाले से सबसे अधिक महत्त्व वाले की ओर।षोडशआधारी लेखन को दशमलव लेखन से भ्रमित करता है।। दाईं ओर से चार-चार के समूह बनाने पर बिट1110और1001क्रमशः 14 और 9 हैं, यानीeऔर9। यह “é” का कोड है, और इकाई दिखाएगी कि आज की टेक्स्ट फ़ाइल में यह कोड एक अकेले बाइटe9के रूप में नहीं, बल्कि दो बाइटों के रूप में रखा जाता है।दोहराएँ: पूर्णांक और उनका निरूपण
प्रश्न 3पिछली इकाइयों से
0xB1 & 0xC0का मान क्या है?&को|से भ्रमित करता है: बिटवार OR ऊपरी बिटों को चुनने के बजाय उन्हें चालू कर देता है।मानता है कि मास्क कुछ नहीं बदलता; वह निचले छह बिट मिटा देता है।&को^, यानी XOR, से भ्रमित करता है।0xB1है10110001और0xC0है11000000: बिटवार AND0xB1के केवल दो ऊपरी बिट रखता है, जो10हैं। यही मास्क पाठ टेक्स्ट ASCII नहीं है किसी अक्षर को आगे बढ़ाने वाले बाइटों को पहचानने के लिए इस्तेमाल करता है।दोहराएँ: बिट और गणितीय लाइब्रेरी
प्रश्न 4पिछली इकाइयों से
std::vector<int> v{4, 7, 10, 3}; std::vector<int> w{}; for (const int x : v) { if (x % 2 == 0) { w.push_back(x); } } std::println("{}", w);क्या लिखता है?शर्त उलट देता है:x % 2 == 0सम संख्याओं के लिए सत्य है।मानता है किpush_backपूरा वेक्टर कॉपी करता है, या कि छँटाईvपर लागू होती है औरvलिखा जाता है।मानता है किpush_backशुरुआत में जोड़ता है; वह अंत में जोड़ता है।लूपvपर चलता है औरwमें केवल सम संख्याएँ, उसी क्रम में जिसमें वे आती हैं, कॉपी करता है;vनहीं बदलता। इकाई टेक्स्ट के साथ यही ढाँचा इस्तेमाल करती है: किसी स्ट्रिंग के बाइटों पर चलकर उनमें से कुछ रखना, या किसी फ़ाइल की पंक्तियों पर चलकर मान्य पंक्तियाँ रखना।दोहराएँ: वेक्टर
प्रश्न 5पिछली इकाइयों से
int n{-1}; std::cin >> n;के बाद उपयोगकर्ताabcटाइप करता है।nका मान क्या है और बाद की रीडिंग के साथ क्या होता है?मानता है कि विफल पढ़ाई कोई निशान नहीं छोड़ती; वह चर में और स्ट्रीम की अवस्था में निशान छोड़ती है।मान लेता है कि C++ अमान्य इनपुट की चेतावनी देती है; प्रोग्राम ऐसे चलता रहता है मानो पढ़ना सफल रहा हो।पूर्णांक पढ़ने को वर्ण पढ़ने से भ्रमित करता है।पढ़ना रिक्त स्थानों को छोड़ता है, ऐसा अक्षर पाता है जिससे कोई संख्या शुरू नहीं हो सकती, और विफल हो जाता है: मानक तय करता है कि चर को 0 मिलता है, वह अक्षर स्ट्रीम में रह जाता है और स्ट्रीम त्रुटि की अवस्था में चली जाती है, बिना किसी संदेश के। पाठ इनपुट को सही ढंग से पढ़ना इस विफलता को डेटा के अंत से अलग पहचानना और उससे उबरना सिखाता है।दोहराएँ: इनपुट, आउटपुट और त्रुटियाँ
प्रश्न 6पिछली इकाइयों सेनीचे दी गई परिभाषाओं में से कौन-सी शीर्षक और वर्ष वाले रिकॉर्ड को सही ढंग से घोषित करती है?
बंद करने वाले ब्रेस के बाद का अर्धविराम भूल जाता है, जो रिकॉर्ड लिखने वालों की पहली त्रुटि है; कंपाइलर उसे सटीक रूप से बताता है।फ़ील्डों को सूची के तत्वों की तरह अल्पविराम से अलग करता है; हर फ़ील्ड एक घोषणा है और अर्धविराम पर समाप्त होता है।रिकॉर्ड को, जिसके फ़ील्ड अलग-अलग प्रकार के और नाम वाले होते हैं, वेक्टर से भ्रमित करता है, जिसके सभी तत्व एक ही प्रकार के होते हैं।हर फ़ील्ड एक चर की तरह घोषित होता है, अपने प्रकार, अपने नाम और ब्रेसों में अपने प्रारंभिक मान के साथ, और परिभाषा बंद करने वाले ब्रेस के बाद अर्धविराम से समाप्त होती है। पाठ टेक्स्ट फ़ाइलें ऐसे रिकॉर्डों के वेक्टर किसी फ़ाइल की पंक्तियों से भरता है।दोहराएँ: रिकॉर्ड
प्रश्न 7यदि
sहैstd::string s{"casa azul"};, तोs.find("x")क्या लौटाता है?यह दूसरी भाषाओं की परिपाटी है;std::size_tचिह्नरहित है, और उसमें बदला गया-1ठीकnposही है, पर परिणाम की-1से तुलना केवल इसी रूपांतरण के कारण काम करती है और कंपाइलर की चेतावनी उत्पन्न करती है।“नहीं मिला” को स्थिति 0 से भ्रमित करता है, जो स्ट्रिंग की शुरुआत में किसी उपस्थिति की स्थिति है।यह एक ईमानदार उत्तर है: पाठ 7.1findऔरnposको प्रस्तुत करता है।प्रश्न 8UTF-8 में सहेजे गए प्रोग्राम में, जैसे इस पाठ्यक्रम के प्रोग्राम हैं,
std::println("{}", std::string{"año"}.size());क्या लिखता है?अक्षर गिनता है;sizeउन बाइटों को गिनता है जिनमें वे लिखे गए हैं।मानता है कि हर अक्षर दो बाइट लेता है; ASCII के अक्षर एक बाइट लेते हैं।यह एक ईमानदार उत्तर है: पाठ 7.2 इसे बाइट-दर-बाइट समझाता है।sizeअक्षर नहीं, बाइट गिनता है: स्पेनिश शब्द “año” (वर्ष) में “a” और “o” एक-एक बाइट लेते हैं, और “ñ”, जो ASCII में नहीं है, UTF-8 में दो बाइट लेता है। पाठ टेक्स्ट ASCII नहीं है इसका कारण समझाता है और अक्षर गिनना सिखाता है।दोहराएँ: टेक्स्ट ASCII नहीं है
प्रश्न 9एक प्रोग्राम
int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);चलाता है और उपयोगकर्ता36टाइप करता है, Enter दबाता है,अनुटाइप करता है और Enter दबाता है।nameमें क्या बचता है?मान लेता है किgetlineनई पंक्ति से शुरू होता है; वह वहीं से शुरू होता है जहाँ>>रुका था।मानता है किgetlineवह फिर से पढ़ता है जो>>पहले ही उपभोग कर चुका है।यह एक ईमानदार उत्तर है: पाठ 7.3 इसी दोष से शुरू होता है।>>36 पढ़ता है और उसके बाद आने वाले नई पंक्ति के वर्ण को स्ट्रीम में छोड़ देता है;std::getlineपहले नई पंक्ति के वर्ण तक पढ़ता है, जो वही है, और उससे पहले जो था वह लौटाता है: कुछ नहीं। पाठ इनपुट को सही ढंग से पढ़ना इसे समझाता है औरstd::wsसे इससे बचता है।दोहराएँ: इनपुट को सही ढंग से पढ़ना
प्रश्न 10एक प्रोग्राम
std::ifstream in{"data.txt"}; int x{-1}; in >> x;चलाता है, पर जिस फ़ोल्डर से वह चलाया जाता है उसमेंdata.txtमौजूद नहीं है। क्या होता है?मान लेता है कि मौजूद न होने वाली फ़ाइल को खोलना ऐसी त्रुटि है जिसकी सूचना C++ देती है; प्रोग्राम बिना चेतावनी के चलता रहता है।पढ़ने के लिए खोलने को लिखने के लिए खोलने से भ्रमित करता है, जो सचमुच फ़ाइल बनाता है।यह एक ईमानदार उत्तर है: पाठ 7.4 इसी जाँच से शुरू होता है।फ़ाइल खोलना विफल हो सकता है, और विफलता केवल स्ट्रीम से पूछने पर दिखती है: इसीलिए पढ़ने से पहलेif (!in)लिखा जाता है। पाठ टेक्स्ट फ़ाइलें इस जाँच को नियम बनाता है और समझाता है कि फ़ाइल की खोज किस फ़ोल्डर पर निर्भर करती है।दोहराएँ: टेक्स्ट फ़ाइलें
सामग्री लोड हो रही है…