Чтение и запись двоичного файла
Я пытаюсь написать код для чтения двоичного файла в буфер, а затем записать буфер в другой файл. У меня есть следующий код, но буфер хранит только пару символов 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 );
Ответы
Ответ 1
Если вы хотите сделать это способом 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), {});
}
Ответ 2
sizeof(buffer) == sizeof(char*)
Используйте длину вместо.
Кроме того, лучше использовать fopen
с "wb
"....
Ответ 3
Вот краткий пример, способ С++ с использованием 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;
}
Ответ 4
sizeof (buffer) - это размер указателя на вашей последней строке НЕ фактический размер буфера.
Вам нужно использовать "длину", которую вы уже установили.
Ответ 5
Вы должны передать длину в fwrite вместо sizeof (buffer).
Ответ 6
Есть намного более простой способ. Это не волнует, является ли это двоичным или текстовым файлом.
Используйте 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];
Ответ 7
Это можно сделать с помощью простых команд в следующем фрагменте.
Копирует весь файл любого размера. Нет ограничений по размеру!
Просто используйте это. Проверено и работает!
#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]" сделает эту работу.