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 :

Problème Header (getch) + ouverture fichier binaire


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Problème Header (getch) + ouverture fichier binaire
    Bonjour à tous !
    J'ai un petit problème dans mon programme, assez facile à résoudre, mais je ne comprends pas pourquoi !

    Il est composé de plusieurs fonctions. Hier, j'ai ajouté la prise en charge des arguments ( int main(int argc, char *argv[]) au lieu de int main(); )
    Or, pour tester la boucle d'affichage des arguments, j'ai fait un petit programme à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    int main(int argc, char *argv[])
    {
        int i;
        for (i=0; i < argc; i++)
        {
            printf("Argument %i : %s \n", i, argv[i]);
        }
        getch();
        return 0;
    }
    Dev c++ indique une erreur sur getch();
    après plusieurs recherches, j'ai vu qu'il fallait inclure <conio.h>
    Effectivement, ça fonctionne à merveille !

    Cependant, dans mon gros programme initial qui utilise et abuse du getch(), il n'y a pas de <conio.h>, pourtant, il fonctionne aussi !
    Je me dis : peut être que getch() est aussi définie dans un autre header...

    Mais quand je copie tous les INCLUDES du gros vers le petit programme (stdlib.h stdio.h math.h io.h fcntl.h string.h), même problème, Dev écrit un truc du genre 'undeclared'.
    Je n'ai pas rédigé d'autre fonction getch() dans mon programme, alors, est-ce un bug du compilateur ? Dans un gros programme, est-ce qu'une déclaration peut être implicite ? Bref, qu'est ce qui explique cette incohérence ?!

    Mon second problème vient d'une fonction du programme.
    En gros, j'ai construit une structure Fichier, comprenant le chemin et le nom du fichier, ainsi qu'une fonction qui prend en paramètre cette structure (1) et une chaîne de caractères.

    Elle crée un fichier, l'ouvre (en binaire) et écrit la chaîne dedans.
    Avant, on saisissait toutes les informations du fichier dans une fonction de saisie, on appelle (1), et ça fonctionnait à merveille!

    Maintenant, je construit un fichier avec les arguments de main (après bien entendu un bricolage et une extraction des chaînes de caractères), l'affichage du nom, prénom est correct, mais la fonction crée un fichier en lecture seule !, donc le programme plante sur ma fonction d'écriture !!

    Pourquoi ya a t-il une différence de traitement de cette fonction alors qu'à priori le fonctionnement est similaire ???
    Je tourne vraiment en rond et ça devient presque lourd !
    Est-ce que quelqu'un peut m'aider ????????????????
    Merci d'avance !!!

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    getch, qui n'est pas une fonction standard, retourne un int et donc il est possible de ne pas le déclarer (car on peut ne pas déclarer une fonction qui retorune un int, mais selon les réglages le compilateur peut être plus strict). Pour ton problème de fichier il nous faut ton code pour voir ce qui ne va pas.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    merci pour le getch !
    le code pour le fichier est :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    typedef struct
    {
    	unsigned char chemin[C];	/* chemin d'accès*/ /
    	unsigned char nom[C];		/* nom = 241 + 3 ext */
    	short int h;				/* handle */
    	unsigned long int taille;	/* taille du fichier en octets */
    } Fichier;
     
    int main(int argc, char *argv[])
    {
     
           strcpy(destination.chemin,"k:\\"); 
           strcpy(destination.nom,"crypt.tmp"); 
     
     
         if (clairtocrypt(destination)==0)
         {....................
     
     
     
    short int clairtocrypt (Fichier Destination)
     
    {
        printf("Ouverture des fichiers\n");
        strcat(Destination.chemin,Destination.nom);
        creationfichier(Destination.chemin); /* fichier vide qui sera la destination */
        Destination.h=open (Destination.chemin, O_RDWR |O_BINARY);
    	if (verifieouverturefichier(Destination)==0)
    	{
    		Destination.taille=512;
    	}
    	else... :aie:
     
     
    short int verifieouverturefichier(Fichier verif)
    {
    	if (verif.h == -1)
    	{
    		printf("Erreur d'ouverture du fichier : %s\n", verif.chemin);
    	    return(-1);
    	}
    	else
    	{
    		printf("Ouverture de: %s :\tREUSSIE\n", verif.chemin);
    	    return(0);
    	}
    }
     
    short int creationfichier(unsigned char* srcfile)
    {
        Fichier cree;
        cree.h=open (srcfile, O_CREAT);:evilred::evilred::evilred::evilred::evilred:
        close (cree.h);
    return 0;
    }
    Et donc le problème, c'est qu'avec un appel de la fonction clairtocrypt en temps normal (une fonction où on saisit les infos au clavier (saisiefichier(void)), le fichier est crée en mode normal, alors que ici, avec le même code, les mêmes chemin et nom, et le même appel, l'attribut est lecture seule !

    le problème se situe bien ici, car j'ai mi un getch() dans clairtocrypt juste après la création du fichier pour pouvoir modifier l'attribut avec l'onglet "propriétés" de zindow$, et ça remarche.

    Y a t-il un bug ? ou plus bourrin, y a t-il une fonction en C (car mon projet ne doit pas utiliser C++) qui annule cet attribut ??????
    Merci d'avance pour toute aide !!

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Quand on utilise la fonction non-standard open() au lieu de la fonction standard fopen(), il faut explicitement spécifier les droits en troisième paramètre si on utilise le flag O_CREATE.

    Sous POSIX, ils s'expriment sous la forme de droits Unix, donc typiquement un nombre en octal (0777 pour donner les tous droits à tout le monde sur le fichier)

  5. #5
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Melem Voir le message
    il est possible de ne pas le déclarer (car on peut ne pas déclarer une fonction qui retorune un int, mais selon les réglages le compilateur peut être plus strict).
    ça reste déconseillé étant donné que cela reste permis en C99 mais risque de ne plus l'être dans les prochaines normes. Mieux vaut tout de suite prendre les bonnes habitudes.
    Cordialement.

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Merci pour cette réponse rapide ! ça marche enfin !!!!
    Et donc pour les droits, est-ce que je mets :

    cree.h=open (srcfile, O_CREAT, 0777) ??

    avec un 'zéro' pour Octal ? quels sont les autres attributs octals ?

    Merci pour tout, car ça m'ôte une énorme épine du pied ! (et du prog...)

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par tarsonis753 Voir le message
    Et donc pour les droits, est-ce que je mets :

    cree.h=open (srcfile, O_CREAT, O777) ??
    Pourquoi open() ? C'est pas standard... Qu'est-ce qui ne va pas avec fopen() ?
    avec un 'zéro' pour Octal ?
    Dans ce cas, c'est 0777 et non O777 ...
    quels sont les autres attributs octals ?
    Définit 'attributs'.

    Doucement avec les smileys, ça me soule...

  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut problèmes de passage Open / fopen
    Salut à tous !
    Au début de la discussion, j'avais créé un programme qui utilisait la fonction open pour manipuler les fichiers.
    Je trouvais plusieurs avantages à cela : sobre, clair, mode binaire.

    Depuis, j'ai réalisé un programme qui ouvre un fichier, lit certaines données et les modifie selon plusieurs paramètres.

    Cela peut s'apparenter à un programme qui ouvre un fichier où est stockée une playliste par exemple, lit les fichiers dans la liste, leur Hash, vérifie s'ils sont disponibles sur le DD et enlève les occurences désuettes (exemple pour simplifier).

    Le problème est que l'on me demande de convertir mes fonctions "open" en "fopen". Je suis d'accords, mais dans le code simplifié suivant :


    -------
    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
     
    if ( (fich=fopen (chemin, "wb+")) == NULL)
    {
       	fprintf(stderr,"Impossible d'ouvrir le fichier données\n");
    	free(ligne);
       	getch();
    	return(1);
    }
     
    printf("Ouverture du ficher : %s\n",chemin);
     
    fseek (fich , 0 , SEEK_END);    /*Trouver la taille du fichier*/
    taille = ftell (fich);
    rewind (fich);
     
    printf("\nAccompli : taille du fichier : %d ",taille);
    -----------

    Je me retrouve devant le fait qu'il n'existe apparemment pas de fonction qui donne la taille du fichier directement (comme filelenght() avec open). Ce n'est pas très grave.

    Mais surtout, je n'arrive pas à créer un mode parmi :
    /*
    "r" ouverture d'un fichier texte en lecture.
    "w" ouverture d'un fichier texte en écriture.
    "a" ouverture d'un fichier texte en écriture à la fin.
    "rb" ouverture d'un fichier binaire en lecture.
    "wb" ouverture d'un fichier binaire en écriture.
    "ab" ouverture d'un fichier binaire en écriture à la fin.
    "r+" ouverture d'un fichier texte en lecture/écriture.
    "w+" ouverture d'un fichier texte en lecture/écriture.
    "a+" ouverture d'un fichier texte en lecture/écriture à la fin.
    "r+b" ou "rb+ ouverture d'un fichier binaire en lecture/écriture.
    "w+b" ou "wb+ ouverture d'un fichier binaire en lecture/écriture.
    "a+b" ou "ab+ ouverture d'un fichier binaire en lecture/écriture à la fin.
    */

    qui me permette de "mettre à jour mon fichier".

    j'ai lu sur un autre forum que "wb+" le faisait, mais cela ne fonctionne pas ici, sous KDE, ce mode écrase irrémédiablement le fichier.
    Le mode append me permet pas de modifier le milieu du fichier.

    La solution que je vois proposée serait de créer un fichier temporaire, mixer dedans mes données, supprimer la source et renommer le fichier temporaire.

    Cependant, mon programme doit manipuler des fichiers de plusieurs GigaOctets, donc :

    ->Existe-t-il un mode me permettant juste de modifier les données à l'intérieur d'un fichier avec fopen ?

    -> Puis-je avoir la taille autrement (sans les API windows) ?

    -> Est-il préférable de conserver open ?

    Merci pour toute aide !
    PS : désolé pour la longueur un peu barbare du message, mais je souhaitais poser la question aussi précisément que possible.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Si "w+b" ne marche pas, alors "r+b" devrait marcher. La différence, si je me souviens bien, c'est que "r+b" ne crée pas le fichier quand il n'existe pas.

  10. #10
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    merci pour une réponse aussi rapide,
    j'ai trouvé une partie du problème, c'était le nom du fichier, sous zindows, je peux manupuler des fichiers sans extensions, pas avec ce programme sous linux. (mon fichier "essai" était écrasé avec l'attribut "r" de fopen", mais pas "essai.txt").
    Ensuite, c'est effectivement "r+b" pour ouvrir un fichier en binaire pour le modifier.
    Merci pour tout !!!!!!!!!!!!

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par tarsonis753 Voir le message
    même en ouvrant mon fichier en lecture ("r"), en utilisant juste le code pour connaitre sa taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fseek (Lu.fich , 0 , SEEK_END);    /*Trouver la taille*/
    Lu.taille = ftell (Lu.fich);
    rewind (Lu.fich);
    le fichier est effacé....
    une idée ?
    C'est pas possible. Le problème est ailleurs.

    Montre ton code exact qui produit ce défaut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème ecriture et lecture fichier binaire
    Par gonzo59 dans le forum C++
    Réponses: 5
    Dernier message: 16/04/2009, 20h02
  2. Ouverture fichier binaire .PIC
    Par jyjeanphi dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/03/2009, 06h52
  3. Ouverture fichier binaire
    Par marc-alex dans le forum Fortran
    Réponses: 2
    Dernier message: 23/02/2009, 14h43
  4. Problème d'écriture vers fichier binaire
    Par Mr Light dans le forum C++
    Réponses: 6
    Dernier message: 27/02/2008, 21h25
  5. Réponses: 5
    Dernier message: 26/03/2007, 01h30

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