Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Fstream] Il ne lit pas le fichier jusqu'au bout...

    23 novembre 2007 à 19:33:14

    Bonjour! :)

    Alors voila, je code un programme de cryptage par la fonction xor. Le xoring dépend de la lettre précédente.
    J'utilise Fstream pour lire/ecrire dans mes fichiers. Cependant le xoring arrive de temps a autre sur 0x1A, c'est a dire "Substitution".
    Et le programme bloque lorsque il rencontre un Substitution.
    fichier.get() ne marche pas lorqu'il rencontre un 0x1A?

    Merci de m'aiclairer sur ce point ;)
    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2007 à 20:18:21

      As-tu bien ouvert ton fichier en mode binaire ?

      De plus, si on pouvait voir ton code ça risque de surement nous aider. ;)
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2007 à 20:23:10

        Non je ne l'ai pas ouvert en mode binaire (je ne vois pas d'ailleur pourquoi je le ferais?)
        Il arrive a traduire les premiers caractères jusqu'a ce qu'il rencontre un SUB (c'est ce qu'il affiche dans notepad++ en tout cas...)
        Bon je vous donne mon code:

        1. #include <iostream>
        2. #include <fstream>
        3. #include <string>
        4. using namespace std;
        5. int main(int argc, char *argv[])
        6. {
        7.         char nouvelle_valeur = NULL, ancienne_valeur = NULL;
        8.         int choix = 0, xoring = 0;
        9.         string nom_du_fichier;
        10.         cout << "Nom du fichier: ";
        11.         cin >> nom_du_fichier;
        12.         ifstream fichier_a_crypt(nom_du_fichier.c_str(), ios::in);
        13.         if(!fichier_a_crypt)
        14.         {
        15.                 cerr << "Erreur a l'ouverture du fichier " << nom_du_fichier.c_str()<< " ! Verifiez si il existe!" << endl << endl;
        16.                 system("PAUSE");
        17.                 return 1;
        18.         }
        19.         cout << endl << endl
        20.                 << "Que voulez vous faire?" << endl << endl << endl
        21.                 << "\t\t1.Crypter" << endl
        22.                 << "\t\t2.Decrypter" << endl << endl
        23.                 << "\t-> ";
        24.         cin >> choix;
        25.         string nom_du_fichier2;
        26.         switch(choix)
        27.         {
        28.         case 1:
        29.                 nom_du_fichier2 = nom_du_fichier + ".crypt";
        30.                 break;
        31.         case 2:
        32.                 nom_du_fichier2 = nom_du_fichier + ".ucrypt";
        33.                 break;
        34.         default:
        35.                 cerr << "Ce choix n'existe pas!" << endl << endl;
        36.                 system("PAUSE");
        37.                 return 2;
        38.         }
        39.         ofstream fichier_a_crypt2(nom_du_fichier2.c_str(), ios::out | ios::ate);
        40.         fichier_a_crypt.get(ancienne_valeur);
        41.         fichier_a_crypt2.put(ancienne_valeur);
        42.         while(fichier_a_crypt.get(nouvelle_valeur))
        43.         {
        44.                 xoring = ancienne_valeur ^ nouvelle_valeur;
        45.                 fichier_a_crypt2.put(xoring);
        46.                 if(choix == 1)
        47.                         ancienne_valeur = nouvelle_valeur;
        48.                 else
        49.                         ancienne_valeur = xoring;
        50.         }
        51.         system("PAUSE");
        52.         return 0;
        53. }
        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2007 à 20:55:11

          Citation : orion78fr

          Non je ne l'ai pas ouvert en mode binaire (je ne vois pas d'ailleur pourquoi je le ferais?)



          Tu devrais, et ton problème vient à coup sûr de là.

          En effet, quand tu l'ouvres en mode texte, les caractères attendus sont des caractères de texte (lettres, chiffres, ponctuation ...) et les autres, non imprimables, comme Substitut par exemple seront interprétés de manière différente suivant les systèmes.

          Ici tu fais un cryptage à partir d'octets (où à un moment donné il y a la valeur 1A), il faut l'ouvrir en binaire pour obtenir ce que tu désires. ;)
          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2007 à 21:00:37

            Citation : orion78fr

            Non je ne l'ai pas ouvert en mode binaire (je ne vois pas d'ailleur pourquoi je le ferais?)



            Il ne faut jamais etre aussi affirmatif !
            De plus, je parie que le probleme ne vient pas du 0x1A mais du 0x0A non ?
            0x0D et 0x0A te poseront des problemes si tu ouvres ton fihcier en mode texte : ce n'est pas normalisé selon les systemes, et comme dit justement Marcus, ça te crée des caracteres non imprimables.

            Codage XOR = codage en mode binaire, ou alors il faut absolument que tu cantonnes tes caracteres dans une limite entre 0x20 et 0x7F. En deça et au dela, tu tombes sur ds caracteres spéciaux (en deça) et non normalisés (au dela).
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              23 novembre 2007 à 21:10:36

              Citation : orion78fr

              Non je ne l'ai pas ouvert en mode binaire (je ne vois pas d'ailleur pourquoi je le ferais?)



              Parce qu'en mode texte les octet sont pris pour des caractère et au premier octet de valeur 0 la lecture arrête!

              allez! va coder p'tit ingrat! ;)
              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2007 à 22:05:39

                Citation : Fvirtman

                De plus, je parie que le probleme ne vient pas du 0x1A mais du 0x0A non ?



                Non je confirme c'est bien 0x1A (cela affiche SUB a la place du caractère et Substitution est 1A, de plus il affiche 1A avec l'éditeur Hexa).

                Sinon j'ai jamais essayé de manipuler des fichiers en binaire, va falloir que je teste! Si j'ai un problème jvous appelle! ;)

                EDIT: Parfait cela marche! Merci beaucoup!
                • Partager sur Facebook
                • Partager sur Twitter

                [Fstream] Il ne lit pas le fichier jusqu'au bout...

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown