FORUM Tom's Hardware » Programmation » C / C++ / Java » Problème de lecture de fichier
 

Problème de lecture de fichier

Il y a 464 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici



Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Problème de lecture de fichier
 
compiler le c c'est bien !!!
Plus d'informations

Bonjour
Voilà je veux programmer un petit programme qui "cache" un fichier text dans une image genre .bmp . En fait je veux justement vérifier si ca marche ! C'est à dire si on peut le faire sans modifier l'image de façon visible à l'oeil nu. C'est bien sur inversible pour récuperer... C'est très con et très nul informatiquement mais bon cela peur servir à passer des email sans se faire choper par les RG (encore qu'ils ne faut pas les prendre pour des cons) en passant des secrets caché dans des images anodines... ;)

voici le programme (c'est ultra basique)

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. using namespace std;
  5. const
  6. rapport=20;//on veut par exemple remplacer, discretos un pixel sur 20 par un élément du texte
  7. const
  8. debut=1000;//estimation rapide de l'entête d'un fichier au format bmp
  9. char nomtexte[14]="texte.txt";
  10. char nomimage[14]="image.bmp";
  11. char nomsortie[14]="sortie.bmp";
  12. int main(void)
  13. {
  14.     ifstream image;
  15.     ifstream texte;
  16.     ofstream sortie;
  17.     char pixel,lettre;
  18.     int i=0;
  19.     image.open(nomimage);
  20.     texte.open(nomtexte);
  21.     sortie.open(nomsortie);
  22.     for(int j=0;j<debut;j++) //C'est pour ne pas affecter les param du bmp
  23.     {
  24.         image.get(pixel);
  25.                   sortie.put(pixel);
  26.     };
  27.     while(!(image.eof()))
  28.     {
  29.         i=i++;
  30.         if (i==rapport)  //la hop on insère le caractère du fichier texte (une fois que i a atteind la valeur "rapport" )
  31.         {
  32.             i=0;
  33.             if (!texte.eof())
  34.             {
  35.                 image.get(pixel); //il faut remplacer donc on continu de lire l'image
  36.                 texte.get(lettre);
  37.                 sortie.put(lettre);
  38.             }
  39.         }
  40.         else
  41.         {
  42.             image.get(pixel);//là on fait que copier pixel à pixel image.bmp dans sortie.bmp
  43.             sortie.put(pixel);
  44.         }
  45.     };
  46.     image.close();
  47.     texte.close();
  48.     sortie.close();
  49.     return 0;
  50. }



C'est très simple et pourtant il y un problème :
le booléen image.eof() se vérifie bien avant la fin du fichier image.bmp. j'ai testé et le programme copie bien les 1000 premier caractères du fichier image.bmp sur sortie.bmp sans problème puis ensuite image.eof() est toujours vrai (donc le fichier est considérer comme fini).
Pouvez vous m'aider ? Sur le net je n'ai que des infos sur les anciennes version de eof sur C (EOF) qui posait poblème.
Est un problème de caractère ascii ? ou ai-je fait une grossière erreur ?
Si oui comment lire un fichier octet par octet autrement ?


Message édité par pierrem69 le 15-11-2005 à 02:48:48

pourquoi faire cent fois la même chose ?

d'ici je vois que t'est sous windows

windows est l'un des derniers OS a ouvrir ses fichiers en mode ''texte'', c'est a dire que des caracteres comme EOF peuvent purement et simplement empecher la lecture des octets suivant ...

faut ouvrir ton fichier en mode binaire, il faut passer un deuxieme argument au constructeur, je crois que c'est ios::binary ou un truc dans ce goût la ...

compiler le c c'est bien !!!
Plus d'informations

Merci je pense que ca doit être ça !!
Mais il fallait connaitre........... (encore un coup de windows...)

Mais non Windows c'est ce qui a de mieux !
Moi je connais pas du tout ta méthode pour lire les fichiers, pour lire par octets je fais comme ca :

char a;

FILE *file;
file=fopen("./nom.txt","r" );

a=fgetc(file);
while (a!=EOF)
{
a=fgetc(file);
}
fclose(file);

J'ai jamais eut de problème avec ça pour les fichiers textes, mais pour les images c'est vrai que ca peut bugger, faut alors utiliser les fonctions binaire (read() et write() ), tu pouras trouver beaucoup beacoup d'info la dessu sur le net.

pourquoi faire cent fois la même chose ?

lord_sector a écrit :

Mais non Windows c'est ce qui a de mieux ![...]
file=fopen("./nom.txt","r" );

(oh une notation unix)

lord_sector a écrit :


a=fgetc(file);
while (a!=EOF)
{
a=fgetc(file);
}


mince alors, a quoi ça servais déjà dowhile() ?

Code :
  1. do {
  2. a=fgetc(file);
  3. while (a!=EOF);



on peut très bien utiliser des fichiers binaires avec fopen et fgets, par exemple :

Code :
  1. char a,s[2];
  2. FILE* file;
  3. if (!(file=fopen("./nom.txt,"rb" ))
  4.     Y_A_UNE_ERREUR(errno);
  5. while(1) {
  6.     if (!fgets(&s[0],2,file)) {
  7.       if (errno) {
  8.         Y_A_UNE_ERREUR(errno);
  9.         } else {
  10.           break;
  11.         }
  12.     }
  13.     a=s[0];
  14. }
  15. if (!fclose(file))
  16.     Y_A_UNE_ERREUR(errno);

Papa very happy !!
Plus d'informations

elch a écrit :


mince alors, a quoi ça servais déjà dowhile() ?

Code :
  1. do {
  2. a=fgetc(file);
  3. while (a!=EOF);





La seule différence que je connaisse entre un

Code :
  1. while(condition) { instructions; }

et un

Code :
  1. do { instructions; } while(condition);

c'est :

  • dans le 1er cas la condition est testée avant de rentrer dans le while
  • dans le 2ème tu exécutes au moins une fois les instructions de la boucle while avant de tester la condition.

Donc dans le 1er cas, tu peux très bien ne jamais rentrer dans ta boucle.

EDIT :
... zut j'avais pas vu l'instruction

Code :
  1. a=fgetc(file);

avant sa boucle while ...
Donc ton do{}while() est effectivement utile ici :D

Profil : Pointeur
Plus d'informations

lord_sector a écrit :

Mais non Windows c'est ce qui a de mieux !
Moi je connais pas du tout ta méthode pour lire les fichiers, pour lire par octets je fais comme ca :

char a;

FILE *file;
file=fopen("./nom.txt","r" );

a=fgetc(file);
while (a!=EOF)
{
a=fgetc(file);
}
fclose(file);

J'ai jamais eut de problème avec ça pour les fichiers textes, mais pour les images c'est vrai que ca peut bugger, faut alors utiliser les fonctions binaire (read() et write() ), tu pouras trouver beaucoup beacoup d'info la dessu sur le net.


on a dit en cpp !
les FILE* c'est en C, et encore...


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
C is a sharp tool
Plus d'informations

lord_sector a écrit :


Moi je connais pas du tout ta méthode pour lire les fichiers, pour lire par octets je fais comme ca :


char a;

FILE *file;
file=fopen("./nom.txt","r" );

a=fgetc(file);
while (a!=EOF)
{
a=fgetc(file);
}
fclose(file);



Non. fgetc() retoure un int. a doit donc être obligatoirement de type int et non char, sinon, EOF (int < 0) risque d'être détecté de façon erronée.

Citation :


J'ai jamais eut de problème avec ça pour les fichiers textes, mais pour les images c'est vrai que ca peut bugger, faut alors utiliser les fonctions binaire (read() et write() ), tu pouras trouver beaucoup beacoup d'info la dessu sur le net.


Tu peux parfaitement lire du binaire avec ce code (corrigé) à condition d'ouvrir le fichier en mode binaire ("rb" ).


Message édité par Emmanuel Delahaye le 17-11-2005 à 13:23:42

---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/

 

C is a sharp tool
Plus d'informations

elch a écrit :

(oh une notation unix)


Fonctionne aussi sous Windows.

Citation :


mince alors, a quoi ça servais déjà dowhile() ?

Code :
  1. do {
  2. a=fgetc(file);
  3. while (a!=EOF);




L'expression idiomatique est plutôt

Code :
  1. int c;
  2. while ((c=fgetc(file)) != EOF)
  3.   /* processing c ... */
  4. }


Citation :

on peut très bien utiliser des fichiers binaires avec fopen et fgets, par exemple :


Déconseillé. fgets() est orienté ligne de texte. On a pas d'info de longueur lue. Il peut y avoir des 0 au milieu de la ligne. D'autre part, fgets() ajoute un 0 final... Bref, on va rien retrouver du tout. Quel est le problème avec fread() qui est fait pour ça ?

http://mapage.noos.fr/emdel/notes.htm#fichiers


Message édité par Emmanuel Delahaye le 17-11-2005 à 13:21:40

---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/

 

compiler le c c'est bien !!!
Plus d'informations

En tout cas ce qui suit, comme cela m'avait été conseiller au début marche très bien avec N'IMPORTE QUEL FICHIER:

Code :
  1. #include <fstream>
  2. using namespace std;
  3. int main(void)
  4. {
  5. char c;
  6. char nomimage[14]="image.bmp";
  7. ifstream image(nomimage,ios::in | ios::binary);
  8. while(!(image.eof()))
  9. {
  10.     c=image.get(pixel);
  11. //blablabla "j'utilise c"
  12. };
  13. return 0;
  14. }


  FORUM Tom's Hardware » Programmation » C / C++ / Java » Problème de lecture de fichier

Aller à :
 

Annonces Google
Publicité
Offres partenaires
Actualités relatives

Bogue avec le téléchargement d&#039;Internet Explorer

Publié le 30 January 2004

Secunia, une entreprise de sécurité informatique a découvert l'existence d'un bogue avec Internet Explorer 6.0 jugée "modérément critique" permettant à un webmestre avec de mauvaises intentions de camoufler l'extension réelle d'un fich Lire la suite

Des SSD chez GreenHouse

Publié le 13 February 2008

GreenHouse propose des SSD au Japon, ce qui peut être une bonne nouvelle. Mais en pratique, ils sont lents et chers. Lire la suite

Le Surfeur d'Argent n'est pas fantastique sur tous les lecteurs Blu-ray

Publié le 08 October 2007

Les Américains possesseurs d’une ancienne platine Blu-ray (comprendre, pas le dernier modèle) ont eu une surprise en voulant lire le blockbuster Les 4 Fantastiques et le Surfeur d’Argent : ce dernier est incompatible avec plusieurs lecteurs. Un méf ... Lire la suite

Un téléchargement pour les supprimer tous

Publié le 31 July 2004

Microsoft vient de mettre en ligne un patch destiné à éradiquer les virus et troyens suivants des machines qui en sont affectées : Mydoom.A, Mydoom.B, Mydoom.E, Mydoom.F, Mydoom.G, Mydoom.J, Mydoom.L, Mydoom.O, Zindos.A, Doomjuice.A, et Doomjuice.B. Une Lire la suite

Les derniers tests

Charts cartes graphiques Q3 2008 : 101 cartes testées

Publié le 29 September 2008

Les charts de 101 cartes graphiques anciennes et récentes sous 9 applications, avec au total 6767 scores. Quel gain attendre du remplacement de votre carte graphique par un nouveau modèle dans chaque application/résolution et en moyenne ? Lire la suite

Upgrader son portable en 9 leçons

Publié le 29 September 2008

Profiter au mieux de son PC portable en 9 leçons. Lire la suite

Que choisir ? Home Cinema 5.1 ou projecteur de son ?

Publié le 25 September 2008

Faut-il craquer pour un ensemble 5.1 ou pour une barre de son ? Découvrez les forces et faiblesses comparées de chaque système. Lire la suite

Intel Core i7 (Nehalem) : une architecture signée AMD ?

Publié le 25 September 2008

Avec ses nouveaux processeurs Core i7, Intel fait évoluer les Core 2 en reprenant leur architecture, mais en lui rajoutant des technologies dont la plupart semblent avoir leur équivalent direct chez AMD. Impression ou réalité ? Lire la suite