IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Manipulation de fichiers : perte de données


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut Manipulation de fichiers : perte de données
    Bonjour,

    j'essaye de faire un petit programme qui fait un XOR en 1 fichier et 1 mot de passe. Quand le fichier n'est pas trop gros ça marche, mais dès que ca dépasse une certaine taille, j'ai des pertes.

    La manip est la suivante : j'ai un fichier A, je fais un XOR avec un mot de passe quelconque, ça me donne un fichier B. Je refait la manip pour le fichier B, ça me donne un fichier C qui devrait être identique au fichier A.

    J'ai testé avec un fichier de 163ko, ça marche, avec un fichier de 3Mo j'ai plein de différences en A et C.

    Mon main ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void main(void)
    {
    	CFichier fichierIn("test.txt", std::ios::in | std::ios::binary);
    	CFichier fichierOut("resultat.txt", std::ios::out | std::ios::binary);
     
    	CXOR xor(pass);
     
    	const long int nbChunk = fichierIn.getNbChunk(BUF_LEN);
    	const long int lastChunkSize = fichierIn.getLastChunkSize(BUF_LEN);
     
    	for(long int i = 0 ; i<nbChunk ; i++)
    	{
    		fichierIn.read(i*nbChunk, BUF_LEN);
    		fichierOut.write(fichierIn.getBuffer());
    	}
     
    	fichierIn.read(i*nbChunk, lastChunkSize);
    	fichierOut.write(fichierIn.getBuffer());
    }
    Les autres fichiers sont en pièces attachées.

    Merci d'avance pour votre aide !

    Andy.
    Fichiers attachés Fichiers attachés

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    j'ai regardé rapidement ton code, et ça me semble beaucoup, beaucoup trop compliqué pour ce qu'il est censé faire.
    Qu'entends-tu exactement par faire "un XOR en 1 fichier et 1 mot de passe"?

  3. #3
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut
    Bonjour,

    l'idée c'est de prendre le premier octet du fichier, le premier octet du mot de passe, de faire un XOR, et d'écrire le résultat dans le fichier de sortie, et ainsi de suite jusqu'à la fin du fichier d'entrée.

  4. #4
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut
    Alors en fait je viens de me rendre compte d'un truc là, j'ai pas filé la bonne version du prog. Mais finalement c'est mieux, ça simplifie les choses.

    Je crée un objet CXOR mais je n'en fais rien. Tout ce que je fais c'est lire le fichier d'entrée et le recopier dans le fichier de sortie, malgré tout j'ai des différences entre les 2 fichiers, pas de taille mais de contenu.
    Donc la classe CXor on s'en fout, le problème doit se situer dans CFichier. J'avais fais cette modif là justement pour isoler le problème.

    Sinon, quel est le souci quand a la complexité de mon prog ?

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut
    Je ne comprends toujours pas ce que tu entends par XOR. Pour moi XOR c'est un ou exclusif ( A XOR B = (A ET non B) OU (non A ET B) ), et je ne vois pas le rapport avec ton histoire de fichiers.

    Ensuite, de ce que je comprends pour l'instant de ton problème, il s'agit de parcourir un fichier et de remplacer un token par un autre. Cela se fait très simplement en C++:
    1. Lire le fichier et stocker son contenu en mémoire (par exemple, lire ligne par ligne et stocker dans un std::vector<std::string>
    2. Parcourir le texte stocké et remplacer les token par le motif souhaité (par exemple avec find et replace).
    3. Ecrire le résultat dans un nouveau fichier.

    S'il n'y a pas de cas particulier compliqué à gérer, cela se fait en quelques lignes.

  6. #6
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 15
    Par défaut
    Il s'agit bien du ou exclusif.
    Je prends le premier caractère de mon fichier, disons "A", je prends le premier caractère de mon mot de passe, disons "?", je fais un XOR entre eux et ça me donne "~" que j'écris dans le fichier résultat. Et je fais de même avec tous les octets du fichier source en cyclant sur le mot de passe.

    Le fichier résultant est alors un version chiffrée du fichier source. Pour retrouver le fichier source, je prends le fichier résultant et je fais la même manip qu'avec le fichier source : je prends le premier caractère, ici "~", je fais un XOR avec le premier caractère du mot de passe, "?", et je retrouve mon "A".

    Je suis bien d'accord avec les points 1,2 et 3.
    Ce que je fais c'est que j'utilise un buffer de taille BUF_LEN.
    Pour copier mon fichier, procède par tronçons de taille BUF_LEN que je lis dans la source puis que j'écris dans le fichier destination.
    Puis à la fin je lis ce qui reste éventuellement et je l'écris de même.

    Seulement les 2 fichiers ne sont pas identiques et je ne vois pas d'où ça vient.

    Je fais un read :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    std::streamsize CFichier::read(std::streampos pos, std::streamsize len)
    {
    	if(!_File.is_open())
    	{
    		return -1;
    	}
    	if(pos<0)
    	{
    		return -2;
    	}
    	if(len<0)
    	{
    		return -3;
    	}
     
    	if(!len) len=size();
     
    	_File.seekg(pos);
     
    	char *charBuffer = new char [len];
    	_File.read(charBuffer, len);
    	std::streamsize actuallyRead = _File.gcount();
     
    	_buffer.clear();
    	if(actuallyRead>0) _buffer.assign(charBuffer, actuallyRead);
     
    	delete [] charBuffer;
     
    	return actuallyRead;
    }
    puis j'écris le contenu du buffer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::streamsize CFichier::write(const std::string &s) const
    {
    	std::ostream outStream(_File.rdbuf());
     
    	outStream.write(s.c_str(), (std::streamsize)s.length());
     
    	return (std::streamsize) s.length();
    }

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Indépendamment des différentes remarques qui t'ont déjà été faite et de différentes erreurs dans le code (void main(void), utilisation de xor, etc.), l'erreur que tu décris me semble provenir de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierIn.read(i*nbChunk, BUF_LEN);
    Qui devrait plutôt être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierIn.read(i*BUF_LEN, BUF_LEN);

Discussions similaires

  1. TCP et transfert de fichiers : Perte de données ?
    Par Latoof dans le forum Réseau
    Réponses: 2
    Dernier message: 31/10/2011, 14h30
  2. Réponses: 5
    Dernier message: 18/10/2009, 13h42
  3. "Erreur de fichier : risque de perte de données"
    Par Carmiel dans le forum Excel
    Réponses: 2
    Dernier message: 20/03/2009, 20h18
  4. Erreur de fichier : Risque de perte de données
    Par sefilote dans le forum Excel
    Réponses: 4
    Dernier message: 20/03/2009, 11h22
  5. Réponses: 3
    Dernier message: 16/02/2006, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo