2011-11-25 12 views
5

मैं कुछ इस तरह प्राप्त करने के लिए कोशिश कर रहा हूँ:एक बफर करने के लिए द्विआधारी मोड में एक फ़ाइल से हिस्सा पढ़ना और एक अन्य फाइल करने के लिए है कि बफर लिख

while (ifstream has not been entirely read) 
{ 
    read a chunk of data into a buffer that has size BUFLEN 
    write this buffer to ostream 
} 

सबसे पहले मैं अपने जबकि के रूप में ifstream.eof() का उपयोग करके इस लक्ष्य को हासिल करने की कोशिश की हालत, लेकिन मैंने सुना है कि यह जाने का रास्ता नहीं है। मैं std :: ios :: ifstream के अन्य कार्यों को देख रहा हूं, लेकिन यह पता नहीं लगा सकता कि और क्या उपयोग करना है।

पुनश्च: मैं एक बफर उपयोग कर रहा हूँ क्योंकि फ़ाइल है कि स्थानांतरित किया जा रहा बहुत बड़ा हो सकता है।

उत्तर

7

iostream कक्षाओं के लिए सभी आवश्यक बफरिंग की देखभाल, ताकि आप नहीं की क्या ज़रूरत है। एक पूरी फाइल कॉपी करने के लिए सामान्य मुहावरा सिर्फ है:

fout << fin.rdbuf(); 

iostream आवश्यक बफरिंग के सभी का ख्याल रखता है।

आप पाश की जरूरत है, शायद इसलिए क्योंकि आप को फिर से लिखने से पहले डेटा पर कुछ परिवर्तनों करना चाहते हैं तो (यह << के कुछ हद तक असामान्य उपयोग करते हैं, के बाद से यह करता है ऐतिहासिक कारणों से, इसमें कोई शक नहीं है प्रारूप नहीं।।) यह है, तो यह एक छोटे से चालबाज है, क्योंकि istream::read “ में विफल रहता है जब तक कि यह ” पात्रों में से अनुरोध की गई संख्या पढ़ता है। इस वजह से, आप भी जाँच कितने वर्ण पढ़ रहे थे, और उन्हें कार्रवाई करने के लिए भले ही पढ़ने में विफल रहा है:

int readCount; 
while (fin.read(&buf[0], buf.size()) 
     || (readCount = fin.gcount()) != 0) { 
    // ... 
    fout.write(&buf[0], readCount); 
} 

यह काफी बदसूरत है; कक्षा में बफर को लपेटने के लिए एक बेहतर समाधान हो सकता है, और इस कक्षा के लिए operator<< परिभाषित करें।

+0

तो अगर मुझे एक बहुत बड़ी फाइल पढ़नी है और उसे किसी अन्य फ़ाइल में लिखना है, तो मुझे बफर का उपयोग करने की चिंता नहीं करनी चाहिए, iostream यह पहले से ही करता है? हालांकि, मैं ऐसा कर रहा हूं क्योंकि मैं बाद के चरण में टीसीपी पर डेटा भेज रहा हूं। कोड के लिए धन्यवाद, मैं इसे आजमाउंगा। – codd

+0

कोड हालांकि काम करता है! धन्यवाद! – codd

+0

किसी अन्य नोट पर: क्या यह गैर-पाठ फ़ाइलों के साथ काम करते समय भी काम करना चाहिए? क्योंकि मुझे इसे किसी भी प्रकार की फ़ाइल (पीडीएफ, एमपी 3, ...) के साथ करने में सक्षम होना चाहिए। और ऐसा लगता है कि मैंने पीडीएफ पर काम नहीं किया है। – codd

0

आपका तर्क बस गलत है।

आप और अधिक इस तरह इसके बारे में जाने की जरूरत है:

while (a chunk larger than zero could be read) 
{ 
    write chunk to output 
} 

देखें कि कैसे भी सरल है? "फ़ाइल के अंत" की स्पष्ट रूप से जांच करने की कोई आवश्यकता नहीं है, जब तक आप असफल न हो जाएं तब तक डेटा पढ़ें। फिर आप कर चुके हैं।

+0

मुझे लगता है कि आपका क्या मतलब है। मैंने शर्त() को स्थिति के रूप में उपयोग करके प्राप्त करने का प्रयास किया, लेकिन पढ़ा() ने एक खाली फ़ाइल दी और पढ़ा() ने प्रतिलिपि के बीच में मेरी फ़ाइल को कचरा के साथ फिर से लिखना जारी रखा। क्या आप विस्तार से सोचने और मुझे विशिष्ट कार्यों का उपयोग करने के लिए दिमाग में लगेगा? – codd

6

istream::read समारोह धारा है, जो एक बूलियन अभिव्यक्ति के रूप में इस्तेमाल किया जा सकता देता है, ताकि आप की तरह कुछ कर सकते हैं:

while (is.read(buffer, BUFLEN)) 
{ 
    outputfile.write(buffer, is.gcount()); 
} 

if (is.eof()) 
{ 
    if (is.gcount() > 0) 
    { 
     // Still a few bytes left to write 
     outputfile.write(buffer, is.gcount()); 
    } 
} 
else if (is.bad()) 
{ 
    // Error reading 
} 

आपको यह देखना होगा कि पाश अंदर लिखने भी विफल नहीं चाहते हो सकता है ।

+0

निम्नलिखित कोड ने मुझे एक खाली नई फाइल दी, शायद आप जानते हैं कि इसके साथ क्या समस्या है? 'जबकि (is.read (बफर, बफलेन)) {outfile.write (बफर, बफलेन); } ' – codd

+0

@codd मेरा उदाहरण कोड विस्तारित किया गया। इसे खुद कोशिश की। –

+0

उदाहरण कोड Joachim के लिए धन्यवाद। यह पीडीएफ आदि जैसे अन्य फाइलों के साथ काम करता प्रतीत होता है! – codd