1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| #include <string>
#include <iostream>
#include <fstream>
#include <bitset>
#include "CompareFiles.h"
using namespace std;
CompareFiles::CompareFiles(string a , string b , int buff, int delta )
: bufferSize(buff), deltaDiff(delta)
{
fluxA.open( a.c_str(), ios::in );
if ( fluxA ) tailleA = tailleFichier ( &fluxA );
else cerr << "Probleme dans le constructeur du flux A" << endl;
fluxB.open( b.c_str(), ios::in );
if ( fluxB ) tailleB = tailleFichier ( &fluxB );
else cerr << "Probleme dans le constructeur du flux B" << endl;
compare();
cerr << "Fin";
}
void CompareFiles::compare(){
int positionA, positionB;
char*bufferA;
char*bufferB;
if ( tailleA == tailleB ) {
// allocate memory:
bufferA = new char [bufferSize];
bufferB = new char [bufferSize];
double counter = 0;
while ( fluxA.good() && fluxB.good() && fluxA.tellg()< tailleA ) {
// read data as a block:
fluxA.readsome (bufferA,bufferSize);
fluxB.readsome (bufferB,bufferSize);
cerr << "position du flux : " << fluxA.tellg() << endl;
// !!!!!!!!!!!!!!!!!!!!!!!!!!
cerr << "position du flux : " << fluxB.tellg() << endl; // ici faut m'expliquer
// !!!!!!!!!!!!!!!!!!!!!!!!!!
for ( int i=0; i<bufferSize; i++ ) {
if ( bufferA[i] != bufferB[i] ) {
positionA = fluxA.tellg(); // On garde la position pour y revenir.
positionB = fluxB.tellg(); // On garde la position pour y revenir. Normalement ils devraient avoir la meme position.
cerr << "position du fluxA detect Err: " << positionA << endl;
cerr << "position du fluxB detect Err: " << positionB << endl;
cerr << "counter : " << counter << " bufferSize : " << bufferSize << " i : " << i << endl;
cerr << "difference entre A et B à l'octet : " << counter*bufferSize + i << endl;
affichageDiff(bufferA, bufferB, i);
fluxA.seekg(positionA);
fluxB.seekg(positionB);
}
}
counter++;
}
delete[] bufferA;
delete[] bufferB;
}
else cerr << "la taille des fichiers est differente" << endl;
}
double CompareFiles::tailleFichier( ifstream *flux ) {
// determine la taille d'un fichier
double length;
flux->seekg (0, ios::end);
length = flux->tellg();
flux->seekg (0, ios::beg);
cout << "taille " << length << endl;
return length;
}
void CompareFiles::affichageDiff(int i){
cerr << "position err : " << i << endl;
if (i>deltaDiff) i-=deltaDiff;
else i=0;
cerr << "position du flux pour err : " << i << endl;
fluxA.seekg(i);
fluxB.seekg(i);
for ( int k = 0; k<2; k++){
if (k==0){
cerr << "A : ";
//fluxA.seekg(i);
}
else {
cerr << "B : ";
//fluxB.seekg(i);
}
for (int j = 0; j < 2*deltaDiff+5; j++) {
if (k==0) cerr << "p" << fluxA.tellg() << "." << fluxA.get() << " ";
else cerr << "p" << fluxB.tellg() << "." << fluxB.get() << " ";
}
cerr << endl;
}
}
void CompareFiles::affichageDiff(char *bufA, char *bufB, int i){
// cerr << b2;
cerr << "Element A " << std::bitset<8>(bufA[i-1]) << " " << std::bitset<8>(bufA[i]) << " " << std::bitset<8>(bufA[i+1]) <<endl;
cerr << "Element B " << std::bitset<8>(bufB[i-1]) << " " << std::bitset<8>(bufB[i]) << " " << std::bitset<8>(bufB[i+1]) << endl;
}
CompareFiles::~CompareFiles()
{
fluxA.close();
fluxB.close();
} |
Partager