Soyez le premier à donner votre avis sur cette source.
Vue 5 061 fois - Téléchargée 166 fois
#include <cstdlib> #include <iostream> #include <unistd.h> //write/close/ #include <fcntl.h> //open/2eme parametre de open sauf 'O_TEXT'/ #include <sys/stat.h> //3eme parametre de open/ using namespace std; int main(int argc, char *argv[]) { int id, idt; char nomfichier[64]; char nomsortie[64]; char contenu[1000000]; char temphex[32]; //char nomvar[16]; char tempimp[32]; int taille; printf("Entrer le nom du fichier BINAIRE a convertir: "); scanf("%s",nomfichier); printf("Entrer le nom du fichier de SORTIE.txt: "); scanf("%s",nomsortie); sprintf(nomsortie, "%s.txt", nomsortie); /* printf("Entrer le nom de la variable contenant le byte code: "); scanf("%s",&nomvar);*/ idt = open(nomsortie, O_BINARY|O_WRONLY|O_CREAT, S_IWRITE | S_IREAD); id = open(nomfichier,O_BINARY|O_RDONLY); if(id!=-1){ lseek(id, 0x00, SEEK_SET); taille = lseek(id, 0x00, SEEK_END); lseek(id, 0x00, SEEK_SET); if(taille == read(id, &contenu, taille)){printf("\nLecture ... OK\n\n");}else{printf("\nErreur anormale a la lecture...\n\n");/*Normalement faudrais stoper*/} write(idt, "{", 1); for(int i=0,h=0 ; i<taille ; i++,h++){ if(h==16){printf("\n");h=0;}//pour la pagination for(int k=0;k<31;k++){temphex[k]='\0';tempimp[k]='\0';} sprintf(temphex,"%x",(unsigned char)contenu[i]); /*if(temphex[0]=='f'&&temphex[1]=='f'&&temphex[2]=='f'&&temphex[3]=='f'&&temphex[4]=='f'&&temphex[5]=='f'){ sprintf(tempimp,",0x%c%c",temphex[6], temphex[7]); }else{*/ if( temphex[1]!='0'&&temphex[1]!='1'&&temphex[1]!='2'&&temphex[1]!='3'&&temphex[1]!='4'&&temphex[1]!='5'&& temphex[1]!='6'&&temphex[1]!='7'&&temphex[1]!='8'&&temphex[1]!='9'&&temphex[1]!='a'&&temphex[1]!='b'&& temphex[1]!='c'&&temphex[1]!='d'&&temphex[1]!='e'&&temphex[1]!='f' ){ sprintf(tempimp,",0x0%c",temphex[0]); }else{ sprintf(tempimp,",0x%c%c",temphex[0], temphex[1]); }//fin du si l'octet vaut zero //}//fin du si y'a le beugue du ffffff printf("%s",tempimp); write(idt, tempimp, strlen(tempimp)); } write(idt, "}", 1); sprintf(tempimp,"\n\nLongueur octal: %d",taille); write(idt, tempimp, strlen(tempimp)); close(idt); close(id); }else{ printf("\nErreur d'ouverture du fichier...\n\n"); } system("PAUSE"); return EXIT_SUCCESS; }
30 nov. 2009 à 10:51
Quelques petites choses en vrac :
> CptPingu, pour le coup du scanf("%s", &nomfichier),
> étrangement ça marche aussi
Non, ca a l'air de marcher uniquement parce que ton tableau est declare dans la pile... si tu modifie d'autres variables, tu peux tres bien perdre un bout de ce que tu as lu (a verifier, mais c'est sans doute implementation dependant).
- A quoi sert ce programme :
Il y a plusieurs reponses :
- Sous Windows pour faire des applications windows : A rien...
Les resources sont la pour ca.
- Sous Windows pour faire du cross-compilation (par exemple developper une appli pour une console de jeu), ca peut etre pratique, mais dans ce cas, il vaudrait mieux que ton programme utilise les parametres de ligne de commande afin de pouvoir etre utilise dans un makefile.
Par exemple, tu pourais avoir pour integrer une image dans ton source:
toto.c : toto.jpg
tonexe toto.jpg
Si ton exe a pour dependance toto.o, le makefile va construire toto.c a partir du jpg en utilisant la regle specifiee, puis toto.o a partir du .c en utilisant la regle implicite (cc -c).
Note que dans ce cas, il est judicieux de generer un .c et le .h qui va avec (pour declarer tes variables en "extern").
Tant que tu es a generer du C, il est aussi bien pratique de generer une deuxieme variable contenant la taille de ton objet (parce que tu ne veux pas avoir a changer ton code chaque fois que tu changes ton image jpg).
Pour faire court, ce genre de programme est pratique dans certains cas, mais il reste des choses a implementer pour que ce soit vraiment pratique.
Eric
23 nov. 2009 à 21:22
23 nov. 2009 à 20:41
23 nov. 2009 à 20:37
23 nov. 2009 à 20:16
devient négatif quand le bit le plus haut est positionné, donc dans la cas d'un char c'est le bit[7].
Kertimanoff, si tu dédies un code à Windows alors tiu peux tout refaire, les scanf et autres histoires de flux sont à reléguer aux musées. Il y a une API qu'il convient d'utiliser.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.