बाइनरी फ़ाइल पढ़ना और लिखना


104

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

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 );

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

जवाबों:


174

यदि आप इसे C ++ तरीके से करना चाहते हैं, तो इसे इस तरह से करें:

#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));
}

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

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

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

    // copies all data into buffer
    std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(input), {});

}

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

8
@ मिखाइल यहां आप कुछ बेंचमार्किंग पा सकते हैं।
पाओलो एम

3
AFAIK, बाइनरी फ़ाइलों में कभी-कभी अपठनीय चार होते हैं, वास्तव में, वे बिल्कुल भी चार नहीं होते हैं। क्या यह कोड गैर-पाठ आधार फ़ाइल पढ़ने के लिए सुरक्षित है? मेरा ज्ञान इस सीमा में छोटा है :)
एंडियाना

5
तथाकथित charबाइट्स को संग्रहीत करने के लिए C / C ++ में उपयोग किया जाता है (और पिछले 40 वर्षों से है)। ऐसा करना सुरक्षित है, जब तक आप वास्तव में उस डेटा को वर्णों के रूप में उपयोग करने की कोशिश नहीं करते हैं (उस पर स्ट्रलेन का उपयोग न करें), इसे कंसोल पर प्रिंट न करें, आदि)। c ++ 17 std::byteइस उद्देश्य के लिए परिचय देता है (जो अभी भी वास्तव charमें भेष में है)
d.Candela

2
@DavidTran अधिक जाने बिना नहीं कह सकता - ऐसा लगता है जैसे आपको एक न्यूनतम उदाहरण बनाना चाहिए जो समस्या को पुन: पेश करता है, और फिर एक प्रश्न पोस्ट करता है।
ब्योर्न पोलेक्स

16

यहाँ एक छोटा उदाहरण है, C ++ का उपयोग करने का तरीका rdbuf। मुझे यह वेब से मिला है। मुझे इस पर अपना मूल स्रोत नहीं मिल रहा है:

#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;
}

8
सबसे अच्छा, गैर पोर्टेबल, विधि यह है कि ओएस को आपकी फ़ाइल को कॉपी करने दें। आखिरकार, यह एक जीवित के लिए यह क्या करता है का हिस्सा है; पहिया को सुदृढ़ करने की कोई आवश्यकता नहीं है ।
थॉमस मैथ्यूज

@BarbaraKwarc: आपके अनुरोध के अनुसार अपडेट किया गया।
थॉमस मैथ्यूज

14
 sizeof(buffer) == sizeof(char*) 

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

इसके अलावा, fopen" wb" के साथ उपयोग करने के लिए बेहतर है ...।


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

उपयोग करने के लिए बेहतर है sizeof(buffer)
जॉन ग्रीन

8

sizeof (बफ़र) आपकी अंतिम पंक्ति पर एक सूचक का आकार है बफर का वास्तविक आकार नहीं। आपको "लंबाई" का उपयोग करने की आवश्यकता है जिसे आपने पहले से ही स्थापित किया था


4

आपको साइज़ोफ़ (बफर) के बजाय फ़ॉरराइट में लंबाई पास करनी चाहिए।


-1

बहुत सरल तरीका है। यह परवाह नहीं करता है कि यह द्विआधारी या पाठ फ़ाइल है।

Noskipws का प्रयोग करें।

char buf[SZ];
ifstream f("file");
int i;
for(i=0; f >> noskipws >> buffer[i]; i++);
ofstream f2("writeto");
for(int j=0; j < i; j++) f2 << noskipws << buffer[j];

-2

यह निम्नलिखित स्निपेट में सरल आदेशों के साथ किया जा सकता है।

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

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

#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]" काम करेगा।


8
और क्या होगा अगर फ़ाइल आकार बफर आकार के कई नहीं है? इसके अलावा, आपको अपने बफर को int[]इसके बजाय घोषित क्यों करना है char[]?
फायरगुरफिकु

मैंने पहले ही उल्लेख किया है कि यह char[]किसी भी आकार की फ़ाइलों के साथ काम करता है, जिसका अर्थ है कि कोई भी शर्त नहीं है कि फ़ाइल का आकार कई बफर आकार का होना चाहिए।
iMajetyHK

यह तथ्य कि आपने कहा था कि यह काम करता है इसका मतलब यह नहीं है कि यह काम करता है। तथ्य यह है कि यह काम नहीं करता है इसका मतलब यह काम नहीं करता है।
nunojpg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.