Я пытаюсь написать код, чтобы прочитать двоичный файл в буфер, а затем записать буфер в другой файл. У меня есть следующий код, но в буфере хранится только пара символов 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 );
Ответы:
Если вы хотите сделать это способом C ++, сделайте это так:
Если вам нужны эти данные в буфере, чтобы изменить их или что-то в этом роде, сделайте следующее:
источник
char
используется в C / C ++ для хранения байтов (и использовался в течение последних 40 лет). это безопасно, если вы не пытаетесь фактически ИСПОЛЬЗОВАТЬ эти данные как символы (не используйте на них strlen (), не выводите их на консоль и т. д.). c ++ 17 вводитstd::byte
для этой цели (который до сих пор остаетсяchar
замаскированнымВот краткий пример использования C ++
rdbuf
. Я получил это из Интернета. Я не могу найти свой первоисточник по этому поводу:источник
Вместо этого используйте длину.
Также лучше использовать
fopen
с "wb
" ....источник
buffer.length()
для буфера, внутри него могут быть значения NULL, что противоречит цели strlen / length ().sizeof(buffer)
.sizeof (buffer) - это размер указателя на вашей последней строке, а НЕ фактический размер буфера. Вместо этого вам нужно использовать "длину", которую вы уже установили.
источник
Вы должны передать длину в fwrite вместо sizeof (buffer).
источник
Есть более простой способ. Неважно, двоичный это файл или текстовый.
Используйте noskipws.
источник
Это можно сделать с помощью простых команд в следующем фрагменте.
Копирует весь файл любого размера. Никаких ограничений по размеру!
Просто используйте это. Протестировано и работает !!
При копировании крошечных файлов было бы полезно иметь меньший размер буфера. Даже "char buffer [2]" подойдет.
источник
int[]
вместоchar[]
?char[]
файлами любого размера, что означает, что нет условия, что размер файла должен быть кратным размеру буфера.