2011-03-24 17 views
68

पढ़ना और लिखना मैं एक बफर फ़ाइल में एक बाइनरी फ़ाइल पढ़ने के लिए कोड लिखने की कोशिश कर रहा हूं, फिर बफर को दूसरी फ़ाइल में लिखें। मेरे पास निम्न कोड है, लेकिन बफर केवल फ़ाइल में पहली पंक्ति से कुछ ASCII वर्णों को संग्रहीत करता है और कुछ भी नहीं।बाइनरी फ़ाइल

int length; 
char * buffer; 

ifstream is; 
is.open ("C:\\Final.gif", ios::binary); 
// get length of file: 
is.seekg (0, ios::end); 
length = is.tellg(); 
is.seekg (0, ios::beg); 
// allocate memory: 
buffer = new char [length]; 
// read data as a block: 
is.read (buffer,length); 
is.close(); 

FILE *pFile; 
pFile = fopen ("C:\\myfile.gif", "w"); 
fwrite (buffer , 1 , sizeof(buffer) , pFile); 
+18

आपको iostream या C फ़ाइल हैंडलिंग का उपयोग करने का निर्णय लेना चाहिए। कृपया दोनों का उपयोग न करें। – frast

उत्तर

123

उपयोग करने के लिए आप इस सी ++ तरह से करना चाहते हैं, इस तरह यह कार्य करें:

#include <fstream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    std::ifstream input("C:\\Final.gif", std::ios::binary); 
    std::ofstream output("C:\\myfile.gif", std::ios::binary); 

    std::copy( 
     std::istreambuf_iterator<char>(input), 
     std::istreambuf_iterator<char>(), 
     std::ostreambuf_iterator<char>(output)); 
} 

आप की जरूरत है कि में डेटा , सी ++ रास्ता rdbuf का उपयोग कर

#include <fstream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::ifstream input("C:\\Final.gif", std::ios::binary); 
    // copies all data into buffer 
    std::vector<char> buffer((
      std::istreambuf_iterator<char>(input)), 
      (std::istreambuf_iterator<char>())); 
} 
+0

मुझे आश्चर्य है कि ये कितने कुशल हैं? – Mikhail

+1

क्या होगा यदि मैं केवल डेटा के कुछ खंड को बफर में कॉपी करना चाहता हूं। यह मेरे द्वारा कैसे हो सकता है? 1024 बाइट्स कहें। – likern

+5

@ मिखाइल [यहां] (http://insanecoding.blogspot.it/2011/11/how-to-read-in-file-in-c.html) आप कुछ बेंचमार्किंग पा सकते हैं। –

6

आकार (बफर) आपकी अंतिम पंक्ति पर पॉइंटर का आकार बफर का वास्तविक आकार नहीं है। आपको "लंबाई" का उपयोग करने की आवश्यकता है जिसे आपने पहले से ही

4

आकार (बफर) के बजाय आपको fwrite में लंबाई पारित करनी होगी।

13
sizeof(buffer) == sizeof(char*) 

इसके बजाय लंबाई का उपयोग करें।

इसके अलावा, बेहतर "wb" के साथ fopen ....

+0

बफर के लिए 'buffer.length()' का उपयोग नहीं कर सकता है इसके अंदर नल मान हो सकते हैं जिससे स्ट्रेल/लम्बाई() के उद्देश्य को हराया जा सके। –

+0

'sizeof (बफर)' का उपयोग करने के लिए बेहतर। –

12

यहाँ एक छोटी उदाहरण है: यह या कुछ और संशोधित करने के लिए एक बफर, यह करते हैं। मुझे यह वेब से मिला। मैं इस पर मेरे मूल स्रोत नहीं मिल सकता है:

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::ifstream f1 ("C:\\me.txt",std::fstream::binary); 

    std::ofstream f2 ("C:\\me2.doc",std::fstream::trunc|std::fstream::binary); 

    f2<<f1.rdbuf(); 

    return 0; 
} 
+6

सर्वोत्तम, गैर पोर्टेबल, विधि ओएस को आपकी फ़ाइल की प्रतिलिपि बनाने देना है। आखिरकार, यह एक जीवित रहने के लिए क्या करता है इसका हिस्सा है; पहिया * को फिर से शुरू करने की कोई ज़रूरत नहीं है। –

+7

? ? कोई नामस्थान नहीं? नब्बे के दशक क्या है? – BarbaraKwarc

+0

@ बरबाराकवार: आपके अनुरोध के अनुसार अपडेट किया गया। –

-3

मैं गंभीरता से क्यों कोई ऐसे जटिल कोड जब यह निम्नलिखित स्निपेट में इस तरह के एक सरल आदेशों के साथ भी हो सकता है लिखने के लिए चुनते हैं समझ में नहीं आता।

किसी भी आकार की पूरी फ़ाइल कॉपी करता है। कोई आकार बाधा नहीं!

बस इसका उपयोग करें। परीक्षण और काम !!

#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
    ifstream infile; 
    infile.open("source.pdf",ios::binary|ios::in); 

    ofstream outfile; 
    outfile.open("temppdf.pdf",ios::binary|ios::out); 

    int buffer[2]; 
    while(infile.read((char *)&buffer,sizeof(buffer))) 
    { 
     outfile.write((char *)&buffer,sizeof(buffer)); 
    } 

    infile.close(); 
    outfile.close(); 
    return 0; 
} 

छोटे बफर आकार होने से छोटी फ़ाइलों की प्रतिलिपि बनाने में मददगार होगा। यहां तक ​​कि "चार बफर [2]" नौकरी करेगा।

+6

और यदि फ़ाइल आकार बफर आकार के एकाधिक नहीं है तो क्या होगा? इसके अलावा, आपको अपने बफर को 'char []' के बजाय 'int []' के रूप में घोषित क्यों करना है? – firegurafiku

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