2009-07-20 12 views
15

में किसी फ़ाइल से एक रेखा हटाएं, मैं फ़ाइल में कुछ पंक्तियां हटाना चाहता हूं और उसी फ़ाइल में कुछ पंक्तियां डालना चाहता हूं, इस पर निर्भर करता है कि लाइन के कुछ हिस्सों एक निर्दिष्ट स्ट्रिंग से मेल खाते हैं या नहीं। सामग्री को कॉपी करने के लिए अस्थायी फ़ाइल का उपयोग किए बिना ऐसा करने का कोई तरीका है?सी भाषा

उत्तर

27

समस्या यह है कि, फ़ाइल (अनिवार्य रूप से) डिस्क पर बाइट्स की एक सरणी है (या जो भी अन्य भौतिक सब्सट्रेट है, लेकिन बाइट्स वैसे भी!), और "एक पंक्ति" बाइट्स की एक अलग संख्या ले सकती है; इसलिए लाइनों को सम्मिलित करने या निकालने के लिए (जब तक कि आप हमेशा बाइट्स में एक ही लंबाई की दूसरी पंक्ति के साथ एक पंक्ति को प्रतिस्थापित नहीं कर रहे हों) बाइट्स में अंतर से बाकी सभी फाइल "अप" या "डाउन" को "स्थानांतरित करने" की आवश्यकता होगी ... जो एक बेहद कठिन ऑपरेशन हो सकता है (क्योंकि शेष फ़ाइल गीगाबाइट्स हो सकती है भले ही आप फ़ाइल की शुरुआत की ओर 1 बाइट द्वारा एक पंक्ति की लंबाई बदल रहे हों)।

तो, ऐसे ऑपरेशन अविश्वसनीय रूप से कठिन हो सकते हैं और इसलिए आमतौर पर परिवर्तनीय रेखा लंबाई (सी, पायथन, जावा, सी ++, रूबी, या किसी अन्य भाषा के साथ किसी भी भाषा सहायक फाइलों में प्राइमेटिव के रूप में कभी भी प्राइमेटिव के रूप में पेश नहीं किया जाता है)। यह बेहद असंभव है कि आपको वास्तव में प्रदर्शन और जोखिम में ऐसी संभावित अनबाउंड लागत का भुगतान करना होगा (जीबी की "शिफ्ट" या डेटा ऊपर या नीचे के दौरान एक सिस्टम या डिस्क क्रैश आपकी पूरी, विशाल फ़ाइल की उपयोगिता को नष्ट कर सकता है), जब पूरी तरह से सरल, पर्याप्त, तेज़, सुरक्षित और उचित तकनीक जिसे आप टालने की कोशिश कर रहे हैं, मूल रूप से शून्य डाउनसाइड्स है (इसलिए यह स्पष्ट से बहुत दूर है कि आप इसे टालने का प्रयास क्यों कर रहे हैं?)।

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

3

आप आसानी से फ़ाइल के किसी अनुभाग को "कट" नहीं कर सकते हैं। आप हमेशा एक अस्थायी प्रतिलिपि बनाते हैं। यह एक सी बात नहीं है; यह किसी भी भाषा के लिए सच है।

आप फ़ाइल को mmap फ़ाइल कर सकते हैं, और फिर जब आपको वह रेखा मिलती है जिसे आप मिटाना चाहते हैं, तो आप लाइन की शुरुआत के स्थान पर सबकुछ याद कर सकते हैं। मैं सवाल करता हूं कि यह कितना कुशल होगा; अस्थायी फ़ाइल तेज हो सकती है।

+0

उपरोक्त जोड़ा जाना आवश्यक है है temp फ़ाइल बहुत * सुरक्षित * है। – RBerteig

+0

अनुमोदित, यह मेरी पहली पसंद नहीं होगी .... या वास्तव में कोई विकल्प। यह केवल एकमात्र चीज है जिसके बारे में मैं सोच सकता हूं कि अनुरोध को पूरा कर सकता है। यह दृष्टिकोण तर्कसंगत रूप से अधिक सुरक्षित है (कोई अस्थायी फ़ाइल अनुमति समस्या नहीं है), लेकिन मैं सहमत हूं कि यह कुछ विफलता के मामले में फ़ाइल को दूषित कर देगा। –

0

यदि फ़ाइल रैम पर प्रसंस्करण के लिए पर्याप्त नहीं है, तो आप तारों की लिंक्ड सूची का उपयोग कर सकते हैं, जहां प्रत्येक नोड एक रेखा का प्रतिनिधित्व करता है, जो कि लिंक की गई सूची का नोड '\ n' चरित्र के आधार पर बनाया गया है और फिर आप सम्मिलित परिचालन कर सकते हैं और लिंक किए गए सूची पर आवश्यकतानुसार ऑपरेशन हटा सकते हैं और फिर आप लिंक की गई सूची का उपयोग कर उसी फ़ाइल पर ओवरराइट कर सकते हैं।

उदाहरण के लिए, mytext।txt

यह एक परीक्षण फ़ाइल

एक लाइन

ऊपर जोड़े जाने के लिए किया गया है इस लाइन

हटाए जाने के लिए किया गया है अब जब आप ऊपर वाली फ़ाइल के किसी लिंक किए गए सूची बना है, यह

[यह एक परीक्षण फ़ाइल है] -> [एक पंक्ति को ऊपर जोड़ा जाना चाहिए] -> [यह पंक्ति हटाए जाने के लिए किया गया है] -> [अमान्य]

सम्मिलित ऑपरेशन

[यह एक परीक्षण फ़ाइल है] से जुड़ा हुआ सूची बदल जाएगा -> [यह एक नई लाइन] है -> [एक > [यह पंक्ति हटाए जाने के लिए किया गया है] - - रेखा से ऊपर] जोड़ा जाना आवश्यक है> [शून्य]

हटाएँ ऑपरेशन

से जुड़ा हुआ सूची बदल जाएगा [यह एक परीक्षण फ़ाइल है] - > [थाई रों एक नई लाइन] है -> [एक रेखा से ऊपर जोड़ा जाना आवश्यक है] -> [अमान्य]

अब आप अंत में '\ n' वर्ण से mytext.txt फ़ाइल से जुड़ा हुआ सूची में लिख सकते हैं हर नोड का।

अंतिम फ़ाइल होगा, mytext.txt

यह एक परीक्षण फ़ाइल

है यह एक नई लाइन

एक लाइन

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