Чтение и запись двоичного файла
Я пытаюсь написать код для чтения двоичного файла в буфер, а затем записать буфер в другой файл. У меня есть следующий код, но буфер хранит только пару символов 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 ответов:
Если вы хотите сделать это в 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) - это размер указателя на последней строке, а не фактический размер буфера. Вам нужно использовать "длину", которую вы уже установили вместо
есть гораздо более простой способ. Это не имеет значения, если это двоичный или текстовый файл.
использовать 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]" сделал бы свою работу.