Побайтовое копирование файла при помощи потоков С++

При помощи потоков можно читать сразу блоки данных, но для начала я решил рассмотреть пример такой утилиты с побайтовым копированием.
Прежде всего нам необходмо подключить потоковые библиотеки С++ и оприделить пространство имён.

#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 файл был скопирован безупречно!

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Имя

    нельзя готовый код в конц законченный полный выложить?

    Ответить
  2. Имя

    вот что у меня получилось, писалось на 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;
    }

    Ответить