/**
 * @file FlotFichier_ES.cpp
 * Projet sem05-td-Cpp2
 * @author l'équipe pédagogique 
 * @version 1 17/01/06
 * @brief corrige du TD n°5 - Exercice 2
 * Structures de données et algorithmes - DUT1 Paris 5
 */

#include <fstream>
#include <cassert>
using namespace std;

#include "FlotFichierES.h"
/**
 * @brief compare deux fichiers
 * @param [in] premier argument flot
 * @param [in] deuxième argument flot
 * @pre les deux flots sont en état de lecture (!fail())
 * @return vrai si les deux flots sont identiques, faux sinon
 */
bool comparer(std::ifstream& f1, std::ifstream& f2) {
	assert(! (f1.fail() || f2.fail()));
	f1.seekg(0,ios_base::end);  // on se place à la fin
	f2.seekg(0,ios_base::end);
	bool egaux = true;
	if (f1.tellg() != f2.tellg())       // fichiers de tailles differentes
		egaux = false;
	else {
		f1.seekg(0,ios_base::beg);  // on se replace au debut
		f2.seekg(0,ios_base::beg);
		while (f1.good() && f2.good() && f1.get()== f2.get());
		egaux = f1.eof(); // et donc f2.eof() car ils ont la meme taille
	}
	return egaux;
}

/**
 * @brief copie d'un fichier par blocs de taille donnée
 * @param [in] fSource est le nom du flot en lecture
 * @param [in,out] fCible est le nom du flot en écriture
 * @param [in] taille est la taille du bloc
 * @pre les deux flots sont en état de lecture/ecriture (!fail())
 * @return vrai si la copie s'est bien passée, faux sinon
 */
bool copierParBlocs(std::ifstream& fSource, std::ofstream& fCible, int tailleBloc) {
	assert(! (fSource.fail() || fCible.fail()));
	char* buffer = new char[tailleBloc];
	streamsize nbOctetsLus;
	while (fSource.good()&& fCible.good()) {
		fSource.read(buffer,tailleBloc);
		nbOctetsLus = fSource.gcount();
		fCible.write(buffer, nbOctetsLus);
	}
	bool ok = ! (fSource.bad() || fCible.fail());
	return ok;
}
