Il programma che segue permette la copia di un file.
Da linea di comando, viene passato un file di origine, uno di destinazione ed eventualmente la dimensione del buffer di lettura/scrittura.

Ad ogni operazione di scrittura viene calcolata la percentuale di avanzamento. Al termine della copia viene stampato il tempo trascorso e la velocità di scrittura:

#include <fstream>
#include <iostream>
#include <sstream>
#include <ctime>

using namespace std;

double perc(unsigned long inputLen, unsigned long writeCount)
{
    return ( ( (double)(writeCount) )/( (double)(inputLen) ) ) * 100.0;
}

string percAdapter(unsigned long inputLen, unsigned long writeCount)
{
    stringstream ss;
    ss << (int)(perc(inputLen, writeCount));
    ss << "%";
    return ss.str();
}

double diffclock(clock_t start, clock_t end)
{
    double t = end - start;
    return (t*1000) / CLOCKS_PER_SEC;
}

int main(int argc, char** argv)
{
    unsigned int bufferSize = 8192;
    clock_t start;
    clock_t end;

    if(argc != 3 && argc != 4)
    {
        cerr << "Usage: copy input_file dest_file [buffer_size]" << endl;
        return -1;
    }
    if(argc == 4)
    {
        bufferSize = atoi(argv[3]);
    }

    ifstream input(argv[1], ios::binary);
    ofstream output(argv[2], ios::binary);
    unsigned long inputLen;
    unsigned long writeCount = 0;

    if(!input.is_open())
    {
            cerr << "Impossibile aprire il file di input" << endl;
            return -2;
    }
    if(!output.is_open())
    {
        cerr << "Impossibile aprire il file di output" << endl;
        return -3;
    }

    input.seekg(0, ios::end);
    inputLen = input.tellg();
    input.seekg(0, ios::beg);

    cout << "Copia di " << argv[1]
        << " (" << inputLen << " byte) in "
        << argv[2] << endl;

    start = clock();

    while(!input.eof())
    {
        char buffer[bufferSize];
        int readLen;

        input.read(buffer, bufferSize);
        readLen = input.gcount();
        output.write(buffer, readLen);
        writeCount += readLen;

        cout << "[" << percAdapter(inputLen, writeCount) << "]\t";
        cout << "[Scritti] " << readLen << " b | ";
        cout << "[Tot] " << writeCount << " b" << endl;

    }

    end = clock();
    double elapsed = diffclock(start, end);

    // INFORMAZIONI //

    cout << endl;
    cout << "Scritti " << writeCount << " byte in "
        << elapsed << " ms = "
        << elapsed/1000.0 << " s" << endl;

    cout << "Velocita' media di scrittura" << endl;
    cout << "\t" << ( (double)(writeCount) ) / elapsed
        << " b/ms" << endl;

    //**************//

    input.close();
    output.close();
}

Il programma apre sia il file di input che quello di output come file binari, quindi è possibile effettuare la copia di qualsiasi file.
Il programma è richiamabile in maniera simile a questa:

mycopy orig.bin dest.bin [buffer_size]

E’ possibile testare la correttezza del risultato ottenuto, ad esempio, mediante il tool a linea di comando md5sum:

md5sum orig.bin dest.bin