При помощи потоков можно читать сразу блоки данных, но для начала я решил рассмотреть пример такой утилиты с побайтовым копированием.
Прежде всего нам необходмо подключить потоковые библиотеки С++ и оприделить пространство имён.
#include <iostream> #include <fstream> using namespace std;
Теперь перейдём к телу функции main(). Прежде всего оприделим два потока: один для ввода данных (считывания из исходного файла), другой — для вывода (записи).
ifstream in("file.mp3", ios::in | ios::binary); ofstream out("copy.mp3", ios::out | ios::binary);
Первый параметр — имя открываемого файла. Второй — побитовая сумма параметров. В нашем случае:
- ios::in — поток для ввода данных
- ios::out — поток для вывода данных
- ios::binary — данные будут считаны в бинарном формате (без преобразования символов)
После определения потоков, проверим корректность выполнения открытия файлов:
if (!in){ cout << "Не удалось открыть файл\n"; return 1; } if (!out) { cout << "Не удалось создать файл\n"; return 2; }
Объявим переменную-буфер (смешно её так называть.. 1 байт):
char ch;
В цикле копируем данные:
while (in) { in.get(ch); if (in) out.put(ch); }
Закрываем открытые потоки:
in.close(); out.close();
Ну и как положено по стандарту:
return 0;
Вот и всё… Мой mp3 файл был скопирован безупречно!
нельзя готовый код в конц законченный полный выложить?
вот что у меня получилось, писалось на Microsoft Visual C++ 2022 в разделе ConsoleApplication, потому что так надежд больше что заработает, а то пойдут ошибки разные, а окажется это не в коде, а за то, что не в том C++ открыли и не в правильном указании что это за программа, поэтому Microsoft Visual C++ по надёжнее.
Дополнив код, вставив как они назвали это Локаль, чтобы русский язык отображал выдавая сообщения в консоле и функции, выдал вот что:
«Не удалось открыть файл»
вот уточнение: на диске есть файл образ раздела жёсткого диска в .adi программы active disk image, я удалив оттуда пробелы и русские буквы, оказалось за это ошибки были указав программе его как источниковый путь на диске С, а конечный путь куда копировать указав Ram диск, то есть раздел, в программе Primo ramdisk server 5.6, это не scsi диск который программам лучше видно, это i/o, да это не текстовый файл, но ему просто не удалось его открыть, в итоге на R появился файл в 0 байт.
вот код.
#include
#include
using namespace std;
int main () {
setlocale(LC_ALL, «Russian»);
ifstream in(«C:\Windows11.adi», ios::in | ios::binary);
ofstream out(«R:\copy11.adi», ios::out | ios::binary);
if (!in) {
cout << "Не удалось открыть файл\n";
return 1;
}
if (!out) {
cout << "Не удалось создать файл\n";
return 2;
}
char ch;
while (in) {
in.get(ch);
if (in) out.put(ch);
}
in.close();
out.close();
return 0;
}