Чтение и запись двоичного файла


Я пытаюсь написать код для чтения двоичного файла в буфер, а затем записать буфер в другой файл. У меня есть следующий код, но буфер хранит только пару символов 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 );
7 76

7 ответов:

Если вы хотите сделать это в 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<char> buffer((
            std::istreambuf_iterator<char>(input)), 
            (std::istreambuf_iterator<char>()));
}
 sizeof(buffer) == sizeof(char*) 

вместо этого используйте длину.

кроме того, лучше использовать fopen С "wb"....

вот короткий пример, способ 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;
}

sizeof (buffer) - это размер указателя на последней строке, а не фактический размер буфера. Вам нужно использовать "длину", которую вы уже установили вместо

вы должны передать длину в fwrite вместо sizeof (буфер).

есть гораздо более простой способ. Это не имеет значения, если это двоичный или текстовый файл.

использовать 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];

Это можно сделать с помощью простых команд в следующем фрагменте кода.

копирует весь файл любого размера. Нет ограничения по размеру!

просто использовать это. Проверено И Работает!!

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

имея меньший размер буфера было бы полезно при копировании крошечных файлов. Даже " char buffer[2]" сделал бы свою работу.