বাইনারি ফাইল পড়া এবং লেখা


107

আমি বাফিনারে একটি বাইনারি ফাইল পড়ার জন্য কোডটি লেখার চেষ্টা করছি, তারপরে বাফারকে অন্য কোনও ফাইলে লিখুন। আমার কাছে নিম্নলিখিত কোড রয়েছে তবে বাফার কেবলমাত্র ফাইলের প্রথম লাইন থেকে দু'টি 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 );

28
আপনার আইওস্ট্রিম বা সি ফাইল হ্যান্ডলিং ব্যবহার করার সিদ্ধান্ত নেওয়া উচিত। উভয় ব্যবহার করবেন না দয়া করে।
ফ্রেস্ট

উত্তর:


176

আপনি যদি এটি সি ++ উপায়ে করতে চান তবে এটি এইভাবে করুন:

#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
@ মিখাইল এখানে আপনি কিছু বেঞ্চমার্কিং খুঁজে পেতে পারেন।
পাওলো এম

4
আফাইক, বাইনারি ফাইলগুলিতে মাঝে মধ্যে অপঠনযোগ্য চর থাকে তবে বাস্তবে এগুলি মোটেই চর নয়। এই কোডটি অ-পাঠ্য বেস ফাইলটি পড়ার জন্য নিরাপদ? আমার জ্ঞান এই সীমার মধ্যে সংক্ষিপ্ত :)
অ্যান্ডিয়ানা

4
তথাকথিত charবাইটগুলি সঞ্চয় করতে সি / সি ++ এ ব্যবহৃত হয় (এবং গত 40 বছর ধরে এটি হয়েছে)। এটি করা নিরাপদ, যতক্ষণ না আপনি প্রকৃতপক্ষে সেই ডেটাটিকে অক্ষর হিসাবে ব্যবহার করার চেষ্টা করবেন না (এটিতে স্ট্র্লেন () ব্যবহার করবেন না, এটি কনসোলে প্রিন্ট করবেন না ইত্যাদি)। সি ++ 17 std::byteএই উদ্দেশ্যে পরিচয় char
করিয়েছে

4
@ ডেভিডট্রান আরও না জেনে বলতে পারছেন না - এটি দেখে মনে হচ্ছে আপনার একটি ন্যূনতম উদাহরণ তৈরি করা উচিত যা সমস্যাটি পুনরুত্পাদন করবে এবং তারপরে একটি প্রশ্ন পোস্ট করবে।
বিজন পোলাক্স

16

এখানে একটি সংক্ষিপ্ত উদাহরণ, সি ++ উপায় ব্যবহার করা হচ্ছে 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
সর্বোত্তম, বহনযোগ্য, পদ্ধতি হ'ল OS কে আপনার ফাইল অনুলিপি করতে দেওয়া। সর্বোপরি, এটি জীবিকার জন্য যা করে তারই অংশ; চাকা পুনর্নবীকরণের প্রয়োজন নেই ।
থমাস ম্যাথিউজ

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

পরিবর্তে দৈর্ঘ্য ব্যবহার করুন।

এছাড়াও, fopen" wb" এর সাথে ব্যবহার করা আরও ভাল ....


buffer.length()বাফারের জন্য ব্যবহার করতে পারবেন না এর ভিতরে নুল মান থাকতে পারে যার ফলে স্ট্র্লেন / দৈর্ঘ্যের () উদ্দেশ্যকে পরাস্ত করে।
জন গ্রীন

ব্যবহার করা ভাল sizeof(buffer)
জন গ্রিন

8

আকার (বাফার) হল আপনার শেষ লাইনের একটি পয়েন্টারের আকার যা বাফারের আসল আকার নয়। আপনি এর পরিবর্তে ইতিমধ্যে প্রতিষ্ঠিত "দৈর্ঘ্য" ব্যবহার করতে হবে


4

আপনার মাপের (বাফার) পরিবর্তে দৈর্ঘ্যের অদ্বিতীয় লেখা উচিত।


-2

অনেক সহজ উপায় আছে। এটি বাইনারি বা পাঠ্য ফাইল কিনা তা বিবেচনা করে না।

নসকিপস ব্যবহার করুন।

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[]কোনও আকারের ফাইলগুলির সাথেও কাজ করে যার অর্থ ফাইলের আকারটি বাফার আকারের একাধিক হওয়া উচিত no
iMajetyHK

আপনি যে কাজ করেছেন বলেছিলেন তার অর্থ এটি কার্যকর হয় না। এটি যে কাজ করে না তার অর্থ এটি কাজ করে না।
নুনোজপজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.