2010-02-18 12 views
5

से बाइट्स को पढ़ें और लिखें, मुझे लगता है कि मुझे शायद एक fstream ऑब्जेक्ट का उपयोग करना होगा, लेकिन मुझे यकीन नहीं है कि कैसे। अनिवार्य रूप से मैं एक बाइट बफर में फ़ाइल में पढ़ना चाहता हूं, इसे संशोधित कर सकता हूं, फिर इन बाइट्स को एक फ़ाइल में फिर से लिखना चाहता हूं। तो मुझे बस यह जानने की जरूरत है कि बाइट i/o कैसे करें।फ़ाइल (C++)

+2

आप द्विआधारी मोड में खोलना चाहते हैं ऊपर से खुला इनपुट/आउटपुट फ़ाइल में भरें। – GManNickG

+1

@GManNickG इसे पर्याप्त तनाव नहीं दिया जा सकता है। ऐसा करने में विफलता आपको यादृच्छिक बग के साथ एक घंटे या उससे भी अधिक समय तक दीवार के खिलाफ अपने सिर को तोड़ने का कारण बन जाएगी। उदाहरण के लिए ... यदि आप एक यादृच्छिक 'cout << file_stream.tellg(); कहीं और कोड विफल करते हैं तो कोड काम करता है। – Tibor

उत्तर

7
#include <fstream> 

ifstream fileBuffer("input file path", ios::in|ios::binary); 
ofstream outputBuffer("output file path", ios::out|ios::binary); 
char input[1024]; 
char output[1024]; 

if (fileBuffer.is_open()) 
{ 
    fileBuffer.seekg(0, ios::beg); 
    fileBuffer.getline(input, 1024); 
} 

// Modify output here. 

outputBuffer.write(output, sizeof(output)); 

outputBuffer.close(); 
fileBuffer.close(); 

स्मृति से मुझे लगता है कि यह इस तरह है।

+0

मैं आमतौर पर उन्हें गतिशील बना देता हूं क्योंकि मैं उन्हें एक फ़ंक्शन पसंद में नहीं डालूंगा – Craig

+4

आपको अभी भी नया उपयोग करने के बाद m_content को हटाने की आवश्यकता है। सी ++ में कचरा संग्रह नहीं है। इसके अलावा 1024 बाइट स्टैक पर आसानी से फिट होना चाहिए ताकि केवल 'char m_content [1024]; ' –

+0

^हाँ इसे न भूलें: डी। – Craig

0

फ़ाइल I/O करते समय, आपको फ़ाइल और त्रुटि शर्तों के अंत में लूप जांच में फ़ाइल को पढ़ना होगा। आप इस

while (fileBufferHere.good()) { 
    filebufferHere.getline(m_content, 1024) 
    /* Do your work */ 
} 
1

तरह उपरोक्त कोड का उपयोग कर सकते यदि आप एक छोटे फ़ाइल आकार के साथ काम कर रहे हैं, तो मेरा सुझाव है कि पूरे फ़ाइल को पढ़ने में आसान है। फिर बफर के साथ काम करें और फिर पूरे ब्लॉक को लिखें। ये बताएंगे कि कैसे ब्लॉक पढ़ने के लिए - यह सोचते हैं आप जबाब

// open the file stream 
    ..... 
    // use seek to find the length, the you can create a buffer of that size 
    input.seekg (0, ios::end); 
    int length = input.tellg(); 
    input.seekg (0, ios::beg); 
    buffer = new char [length]; 
    input.read (buffer,length); 

    // do something with the buffer here 
    ............ 
    // write it back out, assuming you now have allocated a new buffer 
    output.write(newBuffer, sizeof(newBuffer)); 
    delete buffer; 
    delete newBuffer; 
    // close the file 
    .......... 
+0

या बस बफर को बदलना चाहिए और उसे वापस लिखना चाहिए। –

+0

सभी संशोधन प्रकार पर निर्भर करते हैं। अगर यह स्ट्रीम में एक या एक से अधिक बाइट्स के प्रतिस्थापन में से एक है तो यह आसान होगा। हालांकि, अगर परिवर्तन इसे और बाइट जोड़ता है, तो यह मेमोरी ओवरफ्लो अपवाद का कारण बन सकता है - जो एक आम गड़बड़ी है। –