Программа копирования файла

yumik

написать программу копирования файла в двойном экземпляре.Чтение файла происходит блоками.Обработать ошибки.
4 ответа

yumik

у кого какие мысли по данной программе?


yumik

Что значит "в двойном экземпляре" ?Взять исходники программы "cp" из Linux/FreeBSD/UNIX.


yumik

ну для windows подойдет CopyFile()


yumik

Мысли такие: 1. Открываешь файл для чтения. 2. Организовываешь буфер копирования размером в один блок (например, 16Кб). Так если файл будет 3Гб, то его не придется целиком заталкивать в память. 3. Создаешь файл-копию. 4. Последовательно блок за блоком через буфер копируешь файлы.То есть примерно вот так:
#include <fstream>
#include <string>
 
int main()
{
    // Размер буфера 
    const int buf_size = 15638;
 
    // Имя исходного файла
    std::string src_file = "file.txt";
    std::string out_file = "file_copy.txt";
    
    // Создание потока для работы с исходным файлом
    std::ifstream ifs(src_file.c_str(), std::ios::binary);
 
    // Подсчет размер исходного файла
    ifs.seekg(0, std::ios::end);
    std::ios::pos_type src_size = ifs.tellg();
    ifs.seekg(0, std::ios::beg);
 
    // Количество целых проходов (для частей файлы, которые полностью умещаются в буфер)
    size_t a_mount = src_size / buf_size;
    // Остаток (остаток файла)
    size_t b_mount = src_size % buf_size;
 
    
    // Создание потока для файла-копии
    std::ofstream ofs(out_file.c_str(), std::ios::binary);
 
    // Это буфер
    char buf[buf_size];
 
    // Цикл по числу полных проходов
    for(size_t i = 0; i < a_mount; ++i)
    {
        ifs.read(buf, buf_size);
        ofs.write(buf, buf_size);
    }
    
    // Если есть остаток
    if(b_mount != 0)
    {
        ifs.read(buf, b_mount);
        ofs.write(buf, b_mount);
    }
 
    ifs.close();
    ofs.close();
 
    return 0;
}