C++ में फ़ाइल को पंक्ति दर पंक्ति पढ़ना: ifstream और 5 घातक गलतियाँ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में साधारण फ़ाइल पढ़ना अनुभवी डेवलपर्स का कोड भी क्यों तोड़ देता है?

\n\n

एक स्थिति की कल्पना करें: आप कॉन्फ़िग, लॉग या CSV का पार्सर लिख रहे हैं। सब कुछ सरल लगता है — फ़ाइल खोलें, पंक्ति दर पंक्ति पढ़ें, प्रोसेस करें। लेकिन वास्तव में, Stack Overflow पर प्रश्न "Read file line by line using ifstream in C++" हजारों व्यू और सैकड़ों टिप्पणियाँ इकट्ठा करता है। क्यों? क्योंकि शैतान, हमेशा की तरह, विवरण में है।

\n\n

इस लेख में हम सिर्फ यह नहीं दिखाएंगे कि फ़ाइल को सही तरीके से पंक्ति दर पंक्ति कैसे पढ़ा जाए। हम 5 सबसे सामान्य और खतरनाक गलतियों का विश्लेषण करेंगे जो काम करने वाले कोड को बग के ढेर में बदल देती हैं। आप जानेंगे कि क्यों while (!file.eof()) बुराई है, अंतिम पंक्ति को कैसे न खोएं, और बाइनरी फ़ाइलों के साथ क्या करें। चलिए शुरू करते हैं!

\n\n

मूल सिंटैक्स: फ़ाइल कैसे खोलें और पंक्ति कैसे पढ़ें

\n\n

मूल बातों से शुरू करते हैं। क्लास std::ifstream (input file stream) फ़ाइलों को पढ़ने के लिए आपका मुख्य उपकरण है। यहाँ एक न्यूनतम काम करने वाला उदाहरण है:

\n\n
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n    std::ifstream file("example.txt");\n    std::string line;\n\n    if (file.is_open()) {\n        while (std::getline(file, line)) {\n            std::cout << line << std::endl;\n        }\n        file.close();\n    } else {\n        std::cerr << "फ़ाइल खोलने में त्रुटि!" << std::endl;\n    }\n    return 0;\n}
\n\n

लगता है क्या गलत हो सकता है? यहाँ बताते हैं।

\n\n

गलती #1: while (!file.eof()) का उपयोग करना

\n\n

यह शायद शुरुआती लोगों के लिए सबसे लोकप्रिय जाल है। यह तार्किक लगता है: "जब तक फ़ाइल का अंत न हो — पढ़ते रहो"। लेकिन समस्या यह है:

\n\n
    \n
  • eof() केवल असफल पढ़ने के प्रयास के बाद true लौटाता है।
  • \n
  • लूप आवश्यकता से एक अतिरिक्त बार चलेगा।
  • \n
  • अंतिम पंक्ति दो बार प्रोसेस होगी या आपको कचरा डेटा मिलेगा।
  • \n
\n\n

आपदा का उदाहरण:

\n\n
std::ifstream file("data.txt");\nstd::string line;\n\nwhile (!file.eof()) {  // ऐसा कभी न करें!\n    std::getline(file, line);\n    std::cout << line << std::endl;  // अंतिम पंक्ति दो बार प्रिंट होगी\n}
\n\n

सही समाधान: लूप की स्थिति में std::getline का उपयोग करें, जैसा कि पहले उदाहरण में है। यह स्वयं स्ट्रीम लौटाता है, जो bool में परिवर्तित होता है: सफल पढ़ने पर true, और त्रुटि या फ़ाइल के अंत पर false।

\n\n

गलती #2: फ़ाइल खोलने की जाँच को अनदेखा करना

\n\n

यह स्पष्ट लगता है, लेकिन GitHub पर हज़ारों कोड लाइनें इसी कारण से segmentation fault से क्रैश होती हैं। यदि फ़ाइल मौजूद नहीं है या पढ़ने की अनुमति नहीं है, तो ifstream कोई अपवाद नहीं फेंकेगा — यह बस "खराब" स्थिति में होगा।

\n\n

गलत:

\n\n
std::ifstream file("nonexistent.txt");\nstd::string line;\nwhile (std::getline(file, line)) {  // उफ़! फ़ाइल नहीं खुली\n    // यह कोड कभी नहीं चलेगा\n}
\n\n

समस्या यह है कि आपको त्रुटि के बारे में पता नहीं चलेगा। डेटा खाली होगा, और प्रोग्राम का तर्क टूट जाएगा।

\n\n

सही:

\n\n
std::ifstream file("data.txt");\nif (!file) {\n    std::cerr << "फ़ाइल खोलने में विफल!" << std::endl;\n    return 1;\n}\n// फिर पढ़ना शुरू करें
\n\n

if (!file) या if (!file.is_open()) का उपयोग करें — कोई अंतर नहीं है, दोनों स्ट्रीम की स्थिति की जाँच करते हैं।

\n\n

गलती #3: रिक्त स्थान और विभाजकों के बारे में भूल जाना

\n\n

ऑपरेटर >> (निष्कर्षण) पहले रिक्त स्थान तक पढ़ता है। यदि आप इसे std::getline के बजाय उपयोग करते हैं, तो आपको वह नहीं मिलेगा जिसकी आप अपेक्षा करते हैं।

\n\n

उदाहरण: फ़ाइल में स्ट्रिंग "Hello World" है।

\n\n
std::string word;\nfile >> word;  // केवल "Hello" पढ़ेगा\n// word == "Hello"

ब्लॉग

पुस्तक अनुशंसाएँ