Convertir int en 16bits

Discutez d'informatique ici !
rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

Convertir int en 16bits

par rattlesnake » 15 Aoû 2014, 16:57

Bonjour,

Je voudrais savoir s'il y a un moyen simple de convertir un int en un nombre de 16bits en C++...

Merci d'avance !



Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 15 Aoû 2014, 19:07

Tu veux convertir ton int en tableau de bit ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 16 Aoû 2014, 09:03

hello,

ben de base, tout nombre est représenté comme une suite de bits...
Donc ton int de base, c'est stocké comme une suite de bits (potentiellement plus que 16 bits...)

donc la réponse est non, tu peux pas convertir tout int en un type de donnée de 16 bits simplement parce que certains int sont trop gros pour etre stockés uniquement sur 16 bits
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 16 Aoû 2014, 15:22

Ce que moi j'aurais fais (si je savais le faire^^)

Créer un type d'entier de 16 bits comme tu le cherches.

Et dans le cas exposé par fatal error

certains int sont trop gros pour être stockés uniquement sur 16 bits


Sa doit fonctionner un peu comme ça au final avec les registres non ?

Pour simplifier disons que si un registre prend en compte 16 bits.
Si l'int que tu veux stocker fait plus de 16 bits; alors tu en stocke une partie sur ton registre de 16 bits et l'autre sur le registre suivant.

Cela dit je suppose que c'est déjà comme ça que fonctionne les int, et vouloir reprogrammer ça avec un type d'enregistrement ça serait un peu bête.



*Milles excuses si je viens de débiter un tas d'inepties qui je suppose seront corrigées de toute façon^^*
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 16 Aoû 2014, 16:37

La question est mal posé c'est tout.

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 18 Aoû 2014, 10:42

Merci pour vos réponses,
Au fait, je pensais que l'on me demandait seulement de convertir les int en chaines de caractères de 16bits et de les stocker dans un fichier, mais après explication, ils veulent que j'écrive directement dans un fichier binaire sous format 16bits, sachant que la lecture du fichier de base est en ASCII.
Les fichiers de mesures ressemblent à ça :
12 13.2 158 10
11.1 15 10.1 15
...
J'extrais chaque colonne (correspondant à une donnée en particulier), et l'écris dans un fichier séparé, mais on me demande de ne pas l'écrire telle quelle, mais de créer des fichiers binaires où elles seront écrites en 16bits...
Quelqu'un peut-il m'éclairer?

Ci-dessous le code à l'état actuel :
Code: Tout sélectionner
#include
#include
#include


int main()
{
using namespace std;





   ifstream liste("liste_de_fichiers.txt", ios::in);
   
   if(liste)
   {
      string lisligne;
      string filename0, filename1,filename2,filename3,filename4;
      string ligne;
      double doublea,doubleb,doublec,doubled,doublee,doublef;
      double double1, double2, double3, double4, double5, double6;
      
      
      while(getline(liste, lisligne))
      {
            
            liste >> filename0; //lecture du nom de fichier dans un fichier "liste de fichiers"
            filename1 = "/home/rs/Desktop/eclats/" + filename0 + "_1"; //création du nom du fichier où sera retranscrite la colonne 1
            filename2 = "/home/rs/Desktop/eclats/" + filename0 + "_2"; //colonne 2
            filename3 = "/home/rs/Desktop/eclats/" + filename0 + "_3"; // 3
            filename4 = "/home/rs/Desktop/eclats/" + filename0 + "_4"; // 4
            filename0 = "/home/rs/Desktop/données_modèles/données_modèles/2011/" + filename0; //Nom du fichier de base (avec toutes les colonnes)
            
            ifstream fichier0(filename0.c_str(), ios::in); //fichier lecture
            ofstream fichier1(filename1.c_str(), ios::out); // ecritures
            ofstream fichier2(filename2.c_str(), ios::out);
            ofstream fichier3(filename3.c_str(), ios::out);
            ofstream fichier4(filename4.c_str(), ios::out);

            if(fichier0 && fichier1 && fichier2 && fichier3 && fichier4)
               {
                                 
                     fichier0 >> doublea >> doubleb >> doublec >> doubled >> doublee >> doublef; //lecture des 6 colonnes
                     //retranscription d'une colonne par fichier                     
                     fichier1 > double1 >> double2 >> double3 >> double4 >> double5 >> double6;
                           fichier1 << double3*100;
                           fichier2 << double4*100;
                           fichier3 << double5*100;
                           fichier4 << double6*100;
                        
                  }
                  //fichiers traités
                  cout<<filename0<<endl;
                  cout<<filename1<<endl;
                  cout<<filename2<<endl;
                  cout<<filename3<<endl;
                  cout<<filename4<<endl;
               }
               else
                  cerr<<"Impossible d'ouvrir le fichier!1"<<endl;
         
      }
      
      liste.close();
   }
   else
      cerr<<"Impossible d'ouvrir le fichier!"<<endl;

   return 0;
}

Merci d'avance !

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 18 Aoû 2014, 11:36

rattlesnake a écrit:Au fait, je pensais que l'on me demandait seulement de convertir les int en chaines de caractères de 16bits et de les stocker dans un fichier, mais après explication, ils veulent que j'écrive directement dans un fichier binaire sous format 16bits, sachant que la lecture du fichier de base est en ASCII.


Donne nous directement la consigne.

using namespace std n'est pas à la bonne place.
double1 * 100 ça reste un double. Il faut faire (int)(double1 * 100)

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 18 Aoû 2014, 11:52

Cliffe a écrit:Donne nous directement la consigne.


J'obtiens après extraction d'une colonne donnée un fichier contenant :
12 158 123 etc. par exemple, or c'est un fichier texte en ASCII que j'obtiens, ce qui ne leur convient pas, il veulent un fichier binaire où les int sont au format 16bits.

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 18 Aoû 2014, 12:02

Pour convertir tes int.

Code: Tout sélectionner
int x = 124;
std::string ret;
for (unsigned int mask=0x80000000; mask; mask>>=1) {
    ret += (x & mask) ? "1" : "0";
}
ret; // chaîne de 0 et 1

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 18 Aoû 2014, 12:16

Cliffe a écrit:Pour convertir tes int.

Code: Tout sélectionner
int x = 124;
std::string ret;
for (unsigned int mask=0x80000000; mask; mask>>=1) {
    ret += (x & mask) ? "1" : "0";
}
ret; // chaîne de 0 et 1


Ca ca transforme mes int en chaine de caractères à 1 et 0, c'est ce que je faisais au début, mais pas ce qu'il faut. Il faudrait pouvoir stocker les int sous format numérique à 16bits dans un fichier binaire...

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 18 Aoû 2014, 12:31

bah tu recopie les chaînes dans un fichier .bin non ?

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 18 Aoû 2014, 12:49

Cliffe a écrit:bah tu recopie les chaînes dans un fichier non ?

J'ai déjà essayé de mettre les décompositions (en chaine de caractère) des int dans le fichier, mais ce n'est pas ce qu'on me demandait. Je viens de trouver la solution, il fallait au fait que j'ajoute l'option d'écriture dans un fichier binaire au niveau des ofstream, et que j'utilise write plutot que les
#include
#include
#include
#include

using namespace std;

int main()
{






ifstream liste("liste_de_fichiers.txt", ios::in);

if(liste)
{
string lisligne;
string filename0, filename1,filename2,filename3,filename4;
string ligne;
double doublea,doubleb,doublec,doubled,doublee,doublef;
double double1, double2, double3, double4, double5, double6;


while(getline(liste, lisligne))
{

liste >> filename0;
filename1 = "/home/modis/Desktop/eclats/" + filename0 + "_1";
filename2 = "/home/modis/Desktop/eclats/" + filename0 + "_2";
filename3 = "/home/modis/Desktop/eclats/" + filename0 + "_3";
filename4 = "/home/modis/Desktop/eclats/" + filename0 + "_4";
filename0 = "/home/modis/Desktop/données_modèles/données_modèles/2011/" + filename0;

ifstream fichier0(filename0.c_str(), ios::in);
ofstream fichier1(filename1.c_str(), ios::out | ios::binary);
ofstream fichier2(filename2.c_str(), ios::out | ios::binary);
ofstream fichier3(filename3.c_str(), ios::out | ios::binary);
ofstream fichier4(filename4.c_str(), ios::out | ios::binary);

if(fichier0 && fichier1 && fichier2 && fichier3 && fichier4)
{

fichier0 >> doublea >> doubleb >> doublec >> doubled >> doublee >> doublef;
doublec= (int)doublec*100;
doubled= (int)doubled*100;
doublee= (int)doublee*100;
doublef= (int)doublef*100;
fichier1.write ((char *)&doublec, sizeof(int));
fichier2.write ((char *)&doubled, sizeof(int));
fichier3.write ((char *)&doublee, sizeof(int));
fichier4.write ((char *)&doublef, sizeof(int));

while(getline(fichier0, ligne)) // tant que l'on peut mettre la ligne dans "contenu"
{

fichier0 >> double1 >> double2 >> double3 >> double4 >> double5 >> double6;
doublec= (int)doublec*100;
doubled= (int)doubled*100;
doublee= (int)doublee*100;
doublef= (int)doublef*100;
fichier1.write ((char *)&doublec, sizeof(int));
fichier2.write ((char *)&doubled, sizeof(int));
fichier3.write ((char *)&doublee, sizeof(int));
fichier4.write ((char *)&doublef, sizeof(int));


}
cout<<filename0<<endl;
cout<<filename1<<endl;
cout<<filename2<<endl;
cout<<filename3<<endl;
cout<<filename4<<endl;
}
else
cerr<<"Impossible d'ouvrir le fichier!1"<<endl;

}

liste.close();
}
else
cerr<<"Impossible d'ouvrir le fichier!"<<endl;

return 0;
}
[/code]

Merci ;)

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 18 Aoû 2014, 12:57

J'ai tjr pas compris ske tu veux lol. Tant mieux si ça marche.
Par contre y'a encore des erreurs dans le code.

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 18 Aoû 2014, 13:02

Cliffe a écrit:J'ai tjr pas compris ske tu veux lol. Tant mieux si ça marche.
Par contre y'a encore des erreurs dans le code.


lol j'ai mis du temps aussi à capter ce qu'ils me demandaient, mais je ne dois pas retranscrir clairement si tu ne vois toujours pas dsl ^^°
Des erreurs? comme?

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 18 Aoû 2014, 13:09

donne voir ton fichier d'entrée et un fichier de sortie pour voir.

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 18 Aoû 2014, 13:49

Code: Tout sélectionner
#include    // std::cerr
#include     // std::ifstream  std::ofstream
#include      // std:string
#include     // EXIT_SUCCESS

int main() {
    ifstream liste("liste_de_fichiers.txt", ios::in);
   
    if(liste) {
        std::string file_name;
        while(getline(liste, file_name)) {
            ifstream f0("/home/modis/Desktop/données_modèles/données_modèles/2011/" + file_name, ios::in);
            ofstream f1("/home/modis/Desktop/eclats/" + file_name + "_1", ios::out | ios::binary);
            ofstream f2("/home/modis/Desktop/eclats/" + file_name + "_2", ios::out | ios::binary);
            ofstream f3("/home/modis/Desktop/eclats/" + file_name + "_3", ios::out | ios::binary);
            ofstream f4("/home/modis/Desktop/eclats/" + file_name + "_4", ios::out | ios::binary);

            if (f0 && f1 && f2 && f3 && f4) {   
                double a, b, c, d, e, f;
                std::string ligne;
                while(getline(f0, ligne)) {                                                                       
                    f0 >> a >> b >> c >> d >> e >> f;                       
                    f1 << (int)(c * 100.);
                    f2 << (int)(d * 100.);
                    f3 << (int)(e * 100.);
                    f4 << (int)(f * 100.);               
                }
                f1 << std::endl; f2 << std::endl; f3 << std::endl; std::cout << f4 << std::endl;
                f0.close(); f1.close(); f2.close(); f3.close(); f4.close();
            }
            else
                std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;       
        }
       
        liste.close();
    }
    else
        std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;

    return EXIT_SUCCESS;
}

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 18 Aoû 2014, 16:24

Cliffe a écrit:donne voir ton fichier d'entrée et un fichier de sortie pour voir.


Le fichier de sortie est un fichier binaire, du coup impossible de l'ouvrir...

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 19 Aoû 2014, 12:41

Cliffe a écrit:
Code: Tout sélectionner
#include    // std::cerr
#include     // std::ifstream  std::ofstream
#include      // std:string
#include     // EXIT_SUCCESS

int main() {
    ifstream liste("liste_de_fichiers.txt", ios::in);
   
    if(liste) {
        std::string file_name;
        while(getline(liste, file_name)) {
            ifstream f0("/home/modis/Desktop/données_modèles/données_modèles/2011/" + file_name, ios::in);
            ofstream f1("/home/modis/Desktop/eclats/" + file_name + "_1", ios::out | ios::binary);
            ofstream f2("/home/modis/Desktop/eclats/" + file_name + "_2", ios::out | ios::binary);
            ofstream f3("/home/modis/Desktop/eclats/" + file_name + "_3", ios::out | ios::binary);
            ofstream f4("/home/modis/Desktop/eclats/" + file_name + "_4", ios::out | ios::binary);

            if (f0 && f1 && f2 && f3 && f4) {   
                double a, b, c, d, e, f;
                std::string ligne;
                while(getline(f0, ligne)) {                                                                       
                    f0 >> a >> b >> c >> d >> e >> f;                       
                    f1 << (int)(c * 100.);
                    f2 << (int)(d * 100.);
                    f3 << (int)(e * 100.);
                    f4 << (int)(f * 100.);               
                }
                f1 << std::endl; f2 << std::endl; f3 << std::endl; std::cout << f4 << std::endl;
                f0.close(); f1.close(); f2.close(); f3.close(); f4.close();
            }
            else
                std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;       
        }
       
        liste.close();
    }
    else
        std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;

    return EXIT_SUCCESS;
}


Ah je n'avais pas vu cette réponse, je n'en demandais pas autant mais merci !! :)

rattlesnake
Membre Naturel
Messages: 29
Enregistré le: 15 Aoû 2014, 15:01

par rattlesnake » 19 Aoû 2014, 13:25

[quote="Cliffe"]
Code: Tout sélectionner
#include    // std::cerr
#include     // std::ifstream  std::ofstream
#include      // std:string
#include     // EXIT_SUCCESS

int main() {
    ifstream liste("liste_de_fichiers.txt", ios::in);
   
    if(liste) {
        std::string file_name;
        while(getline(liste, file_name)) {
            ifstream f0("/home/modis/Desktop/données_modèles/données_modèles/2011/" + file_name, ios::in);
            ofstream f1("/home/modis/Desktop/eclats/" + file_name + "_1", ios::out | ios::binary);
            ofstream f2("/home/modis/Desktop/eclats/" + file_name + "_2", ios::out | ios::binary);
            ofstream f3("/home/modis/Desktop/eclats/" + file_name + "_3", ios::out | ios::binary);
            ofstream f4("/home/modis/Desktop/eclats/" + file_name + "_4", ios::out | ios::binary);

            if (f0 && f1 && f2 && f3 && f4) {   
                double a, b, c, d, e, f;
                std::string ligne;
                while(getline(f0, ligne)) {                                                                       
                    f0 >> a >> b >> c >> d >> e >> f;                       
                    f1    // std::cerr
#include     // std::ifstream  std::ofstream
#include      // std:string
#include     // EXIT_SUCCESS

int main() {
    std::ifstream liste("liste_de_fichiers.txt", std::ios::in);
   
    if(liste) {
        std::string file_name;
        while(getline(liste, file_name)) {
            std::ifstream f0(("/home/modis/Desktop/données_modèles/données_modèles/2011/" + file_name).c_str(), std::ios::in);
            std::ofstream f1(("/home/modis/Desktop/eclats/" + file_name + "_1").c_str(), std::ios::out | std::ios::binary);
            std::ofstream f2(("/home/modis/Desktop/eclats/" + file_name + "_2").c_str(), std::ios::out | std::ios::binary);
            std::ofstream f3(("/home/modis/Desktop/eclats/" + file_name + "_3").c_str(), std::ios::out | std::ios::binary);
            std::ofstream f4(("/home/modis/Desktop/eclats/" + file_name + "_4").c_str(), std::ios::out | std::ios::binary);

            if (f0 && f1 && f2 && f3 && f4) {   
                double a, b, c, d, e, f;
                std::string ligne;
                while(getline(f0, ligne)) {                                                                       
                    f0 >> a >> b >> c >> d >> e >> f;                       
                    f1 << (int)(c * 100.);
                    f2 << (int)(d * 100.);
                    f3 << (int)(e * 100.);
                    f4 << (int)(f * 100.);               
                }
                f1 << std::endl; f2 << std::endl; f3 << std::endl; std::cout << f4 << std::endl;
                f0.close(); f1.close(); f2.close(); f3.close(); f4.close();
            }
            else
                std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;       
        }
       
        liste.close();
    }
    else
        std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;

    return EXIT_SUCCESS;
}


maintenant ça marche !
merci encore

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 14:25

par Cliffe » 19 Aoû 2014, 13:44

j'ai oublier les std oui :lol3:
y'a encore un std::cout en trop, enlève le ^^

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite