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 :

Transcription d'un fichier binaire en un fichier texte !


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de tchalkost
    Inscrit en
    Juillet 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 102
    Points : 35
    Points
    35
    Par défaut Transcription d'un fichier binaire en un fichier texte !
    Bonjour je code en C et j’utilise Microsoft Visual C++.
    Mon problème est le suivant, je dois copier un fichier qui n’est pas au format texte (donc ouverture en binaire). Puis je copie son contenu dans un nouveau fichier cette fois-ci au format texte. Voici mon code :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define TEMP 60
    
    //-----------DEBUT-PROGRAMME------------//
    void main (void)
    {
    	//Declaration(s) de la(des) variable(s)
    	char daterecherche[6], nomfic_srcPCA[TEMP];
    
    	FILE *stream;
    	int list[50];
    	int i, numread, numwritten;
    
    
    	//Demande du parametre "daterecherche"
    	printf("Veuillez saisir la date de la recherche pour les prelevement\n");
    	fgets(daterecherche, 7, stdin); //date au format JJMMAA !
    
    	strncpy (nomfic_srcPCA, "Fichier_cherche-", TEMP);
    	strncat (nomfic_srcPCA, daterecherche, TEMP);
    
    
    	if(nomfic_srcPCA)
    	{
    		printf("Fichier trouve\n");
    
    		//ecriture dans le nouveau fichier
    		if( (stream = fopen("Nouveau_Fichier.txt", "wb")) != NULL)
    		{
    			//JE VEUX QUE MON ECRITURE DANS list
    			//SOIT AU FORMAT TEXTE => en ASCII
    			for (i=0; i<50; i++)
    			{
    				list[i] = (char)(list[i]);
    			}
    			//Dans fwrite je ne met que 50 juste pour mon essai
    			numwritten = fwrite (list, sizeof(char), 50, stream);
    			printf("Wrote %d items\n", numwritten);
    			fclose(stream);
    		}
    		else
    		{
    			printf("Problem opening the file\n");
    		}
    
    		//affichage du contenu à l’ecran
    		if( (stream = fopen("nomfic_srcPCA", "rb")) != NULL)
    		{
    			numread = fread(list, sizeof(char), 50, stream);
    			printf("Number of items read = %d\n", numread);
    			printf("Contents of buffer = %.50s\n", list);
    			fclose(stream);
    		}
    		else
    		{
    			printf("File could not be opened\n");
    		}
    	}
    	else
    	{
    		printf("Erreur fichier\n");
    	}
    }
    //-----------FIN-PROGRAMME------------//
    Le contenu de mon fichier d’essai est le suivant :
    « test de verification
    test du saut de ligne
    ca marche » (Bon d’accord ce n’est pas très évolué)

    Mais le résultat du programme est un fichier avec des caractères qui sont illisible. Ça vient surement du fait que je suis en binaire.
    Je pense que mon souci vient au moment ou je dois écrire dans le fichier, car lorsque j’affiche le contenu du fichier a l’écran je retrouve bien mon texte.

    Quelqu’un pourrait-il m’aider ?
    J’avais vu dans un post qu’il y avait la fonction « strtol » j’ai essayé d’utiliser cette fonction avec les descriptif du man mais j’avais une erreur au niveau du format du paramètre. Je me casse la tête depuis hier. Je n’arrive pas à avoir un affichage correct pour ré-exploiter le fichier. http://man.developpez.com/man3/strtol.3.php

    Je pense que je devrais transformer du binaire en caractère, mais je ne sais pas trop comment m’y prendre. Merci d’avance pour vos aides.
    PEACE AND LOVE !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu sembles embrouillé.
    Déjà, il faut que les formats soit clairement définis.

    Format d'entrée:

    Que contient exactement le fichier d'entrée en binaire ? Des nombres ? Des caractères ? La taille d'une entrée est-elle constante ou variable ? Si elle est variable, comment la récupère-t-on ? etc.

    Format de sortie:
    Sous quelle forme est ton fichier texte ?

    Implémentation:
    1. main() retourne TOUJOURS un int.
    2. if(nomfic_srcPCA) sur un tableau ne veut rien dire. Le if() sera toujours vrai.
    3. Tu n'ouvres pas le fichier binaire en lecture.
    4. Tu n'ouvres pas le fichier texte du tout.
    5. TEMP est un mauvais nom pour une taille de buffer.
    6. Ta conversion est foireuse, mais on ne pourra pas la corriger avant d'être absolument certain des formats d'entrée et de sortie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    Je t'arrete tout de suite, "convertir un fichier texte en binaire" ça veut absolument rien dire.
    Quand a la difference d'ouverture d'un fichier en mode texte ou binaire, elle est minime, je crois que ça concerne juste les sauts de ligne (et sous windows seulement).

    //JE VEUX QUE MON ECRITURE DANS list
    //SOIT AU FORMAT TEXTE => en ASCII
    Ca aussi ça veut rien dire, ou plutot tu te trompes complet sur le sens de ASCII. Il s'agit du jeu de caracteres de 0 à 127 qui est la base de la plupart des jeux de caractere. En supposant que l'encodage d'entrée est celui de windows (windows-1252), transformer en ASCII ça voudrait dire jarter tous les caracteres accentués latins (ceux dans la tranche 128-255).

    Si ya des caracteres bizarres dans ton fichier de sortie, ce que ya une boulette dans le code (buffer non initialisé, depassement de chaine, suite de caracteres non terminée par \0...)

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,


    C'est un détail, mais pourquoi écris-tu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char daterecherche[6];
    /*...*/
    fgets(daterecherche, 7, stdin);
    ???

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    C'est pas un detail, si le texte tapé faisait 6 caracteres en comptant le saut de ligne, ça ferait un depassement de buffer.
    Une bonne ecriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(daterecherche, sizeof daterecherche, stdin);

  6. #6
    Nouveau membre du Club Avatar de tchalkost
    Inscrit en
    Juillet 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 102
    Points : 35
    Points
    35
    Par défaut
    Putain vous me foutez la pétoche, je me trompe depuis le début alors ...

    Medinoc a dit:
    Que contient exactement le fichier d'entrée en binaire ?
    Des chiffres et de lettres (ce n'est pas un mauvais jeu de mots)

    La taille d'une entrée est-elle constante ou variable ?
    Je ne vois pas tellement ce que tu me demande mais une fois que le fichier a copié est créé il n'est plus modifié. Je pense que c'est ça que tu appel constante ?

    Sous quelle forme est ton fichier texte ?
    Exactement la même forme que le premier fichier. Dans le premier le format n'est pas .txt mais dans le deuxième si.

    if(nomfic_srcPCA) sur un tableau ne veut rien dire. Le if() sera toujours vrai.
    La je ne comprends pas car vu que le nom du fichier est un nom composé, je vérifie si ce fichier existe bien. Et lorsque pour le test je tape un mauvais choix volontairement le IF fonctionne très bien car il m'affiche le message erreur comme quoi le fichier n'existe pas.

    Gruik a dit:
    Je t'arrete tout de suite, "convertir un fichier texte en binaire" ça veut absolument rien dire.
    En faite je voulais dire que le fichier vu que ce n'est pas un fichier texte, il fallait ouvrir ce fichier en binaire. En faite c'est dans cette direction que l'on m'a dirigé mais si vous avez d'autres proposition a me faire je suis toute ouï.

    En supposant que l'encodage d'entrée est celui de windows (windows-1252), transformer en ASCII ça voudrait dire jarter tous les caracteres accentués latins (ceux dans la tranche 128-255).
    Je vois bien ce que tu veux dire par l'histoire des tranches, mais lorsque je regarde à l'intérieur des fichiers ils ne contiennent que du texte en majuscules, minuscules, chiffres et quelques fois des accents.

    Merci pour vos réponses, j'espère que les précisions que je vous donne vous aideront a répondre à mon problème.
    PEACE AND LOVE !

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par tchalkost
    Des chiffres et de lettres (ce n'est pas un mauvais jeu de mots)
    Donc, il ne contiendrait rien d'autre que du texte ? Pourquoi l'ouvrir en binaire alors ?
    Je ne vois pas tellement ce que tu me demande mais une fois que le fichier a copié est créé il n'est plus modifié. Je pense que c'est ça que tu appel constante ?
    Non. Un fichier binaire est généralement composé d'"enregistrements", ou d'"entrées", dont la taille peut être fixe (toutes les entrées ont la même taille) ou variable.
    Exactement la même forme que le premier fichier. Dans le premier le format n'est pas .txt mais dans le deuxième si.
    .txt n'est pas le format, mais l'extension. Si les fichiers sont exactement dans le même format et si seul le nom change, une bête fonction de copie fait parfaitement l'affaire: Aucune conversion n'est nécessaire.

    La je ne comprends pas car vu que le nom du fichier est un nom composé, je vérifie si ce fichier existe bien. Et lorsque pour le test je tape un mauvais choix volontairement le IF fonctionne très bien car il m'affiche le message erreur comme quoi le fichier n'existe pas.
    Pas ce if-là, en tout cas. Le if suivant, peut-être, mais celui-ci ne sert absolument à rien.
    En faite je voulais dire que le fichier vu que ce n'est pas un fichier texte, il fallait ouvrir ce fichier en binaire. En faite c'est dans cette direction que l'on m'a dirigé mais si vous avez d'autres proposition a me faire je suis toute ouï.
    Un fichier qui a le même format qu'un .txt et qui serait binaire ? Il y a une faille, là. Soit c'est un fichier texte, soit il n'a PAS le même format qu'un .txt, soit il y a quelque part un crétin qui s'amuse à mettre des données binaires brutes dans un fichier .txt, alors que .txt est une extension communément réservée aux fichier texte.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Nouveau membre du Club Avatar de tchalkost
    Inscrit en
    Juillet 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 102
    Points : 35
    Points
    35
    Par défaut
    Medinoc a dit:
    Pourquoi l'ouvrir en binaire alors ?
    Alors la très bonne question je n'y avait pas pensé.

    Pas ce if-là, en tout cas. Le if suivant, peut-être, mais celui-ci ne sert absolument à rien.
    Bien vu j'avais une condition d'égalité en faite a ce niveau mais je l'avais oublié en le retapant.

    Un fichier qui a le même format qu'un .txt et qui serait binaire ? Il y a une faille, là. Soit c'est un fichier texte, soit il n'a PAS le même format qu'un .txt, soit il y a quelque part un crétin qui s'amuse à mettre des données binaires brutes dans un fichier .txt, alors que .txt est une extension communément réservée aux fichier texte.
    En faite a cette étape, ce fichier est créé automatiquement par le logiciel, le seul paramètre qui change c'est la date c'est pourquoi il y a une recherche au niveau de la date. Bref l'extension du fichier source est .dvi mais moi lorsque je vais le recopier je veux qu'il ait l'extension .txt. Et je suis en train de me rendre compte que juste une copie en modifiant le nom est largement suffisante.

    Merci encore pour toutes ces informations. Je vais essayer avec une copie toute simple

    PS: Voici pourquoi j'essayé a tout prix d'ouvrir mon fichier, car j'avais lu sur ce lien que pour copier un fichier il fallait d'abord l'ouvrir pour ensuite copier ce qu'il y avait a l'intérieur. http://c.developpez.com/faq/c/?page=fichiers
    Enfin je sais pas si je mélange tout encore ...
    PEACE AND LOVE !

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par tchalkost
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	char daterecherche[6]
    	fgets(daterecherche, 7, stdin); //date au format JJMMAA !
    Quelqu'un te l'a déjà fait remarquer l'incohérence, mais j'ajoute :

    Vu le format de ta date JJMMAA, soit 6 caractères, il faut en réserver au moins 7.

    Ne jamais oublier le zéro final, ce qui est, hélas, un bug extrêmement fréquent.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  10. #10
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    En fait il en faut 8 (ou 9?) pour le saut de ligne

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par Gruik
    En fait il en faut 8 (ou 9?) pour le saut de ligne
    Pas forcément : on peut parfaitement "nettoyer" la chaîne entrée immédiatement après la saisie, en remplaçant le saut de ligne par un zéro.

    Mais ce n'est pas forcément inutile de prendre de la marge (encore qu'avec fgets, dans la mesure où on a mis la bonne valeur pour la longueur maximale, il n'y a pas de problème de débordement).
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Gruik
    Salut,
    <snip>
    Quand a la difference d'ouverture d'un fichier en mode texte ou binaire, elle est minime, je crois que ça concerne juste les sauts de ligne (et sous windows seulement).
    <snip>
    Non, cela concerne aussi la taille occupées par les types classiques...

    Quand tu écris un entier dans un fichier ouvert en mode binaire, il prendra une taille correspondant à sizeof(int) octets (soit, si l'on accepte l'idée d'un int codé sur 32 bits, et c'elle d'un char sur 8bits, 4 octets ou 4 caractères), alors que si ton fichier est ouvert en mode "texte" ("rt","wt"...) il prendra... 1 caractère s'il vaut entre 0 et 9, 2 s'il vaut entre 10 et 99, 3 entre 100 et 999 etc...

    La différence sera frappante si tu viens à essayer d'ouvrir un fichier dont la création a été effectué en mode binaire avec un éditeur de texte tout simple (style "note pad")... les valeurs numériques risque de faire apparaitre différents signe cabalistiques en fonction de la valeur qu'elle est sensée représenter...

    De plus, normalement, certaines fonctions de lecture dans les fichiers sont réservée à un mode d'acces au fichier bien particulier, ce que l'on ignore bien souvent...

    Les fonctions qui permettent, par exemple, d'accéder aux éléments d'un fichier de manière séquentielle indexée (ISAM) sont, normalement, réservée aux fichiers "binaires"

    Ceci dit, pour arriver à faire la convertion, il faut:
    • un fichier "d'entrée", ouvert en lecture avec le mode d'ouverture adéquat (ici, binaire, vu que tu veux faire la transition binaire->texte)
    • un fichier "de sortie", ouvert en écriture avec le mode d'ouverture adéquat (ici, texte, pour la meme raison)
    • une variable ou une structure qui correspond à ce que tu t'attend à lire (pour cela, il faut savoir ce que contient le fichier source)
    • une boucle qui lit d'un coté et qui écrit de l'autre
    • sans oublier, cela va de soi, de fermer les deux fichiers une fois que tu as fini...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Gruik
    Quand a la difference d'ouverture d'un fichier en mode texte ou binaire, elle est minime, je crois que ça concerne juste les sauts de ligne (et sous windows seulement).
    Exact. Ouvrir un fichier en format texte remplace les séquences "\r\n" (Windows) et "\r" (Mac) par "\n" (Unix). C'est juste une facilité fournie par le système pour être à même d'écrire du code portable, c'est-à-dire en considérant qu'un saut de ligne se traduit par '\n' quelque soit l'O.S. .
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Mais ce n'est pas la seule différence, ainsi que je l'ai signalé...

    Si tu ouvre un fichier sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FILE *fp=fopen("monfichier","wb");
    et que tu as une structure du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct mastrut
    {
        int machin;
        char nom[20];
        int truc;
        char bidul[30];
    } montype;
    tu peux si tu le souhaites écrire dans le fichier sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    montype data[10];
    /* tout ce qu'il faut pour initaliser le tableau de data */
    fwrite(data,sizeof(montype),10,fp);
    Si nom ou bidule son plus petit que la taille qui a été prévue (que nom="jean"), tu trouveras le '\0' apres le n, suivi par une foulle d'autres caractères inutilisés (peut etre '\0' si tu a initialisé toute la chaine à '0', mais peut etre aussi les crasses d'une utilisation antérieure de la mémorie)... le tout pour atteindre la fameuse taille des 20 caractères

    Plus tard, en l'ouvrant sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FILE *fp=fopen("monfichier","rb");
    tu pourras accéder, si tu le souhaites, au 3eme élément sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    montype data;
    fseek(fp,sizeof(montype)*3,0);/*va au début du troisième élément */
    fread(&data,sizeof(montype),1,fp);
    deux choses qui seront impossible si tu ouvre ton fichier avec un mode basé sur "<*>t",(ou l'étoile est r, w ou n'importe quoi s'adaptant à un mode d'ouverture) pour la simple et bonne raison que machin et truc (les deux entiers dans la structure) auront toujours la meme taille (sizeof(int)) si le fichier est ouvert en binaire, mais auront une taille dépendant de la valeur (entre 1 et 10 caractère, si l'on considère les int comme étant codés sur 32bits) si tu l'ouvre en mode "texte"...

    En fait, je me suis trompé dans mon message précédent:

    Quand tu ouvre un fichier en mode "binaire" ("rb", "wb"...) tu ouvre ton fichier en "acces direct" (cf démonstration ci-dessus)

    Tu peux donc décider de le parcourrir dans n'importe quel sens, de sauter n'importe quel nombre d'élément(s) pour autant que tu en connaisse leur taille, que ce soit vers l'avant ou vers l'arrière...

    Si tu sais que tu as 20 éléments de type mastruct1 suivis de 20 éléments de type mastruct2, et que tu es sur le troisième élément de type mastruct1, tu peux très bien envisager de sauter au dizieme élément de type mastruct2... Si tant est que cela soit logique de l'envisager...

    Quand tu ouvre un fichier en mode "texte" ("rt","wt"...) tes nombres seront écrits sous la forme de chaine de caractères (tu verras 1, 123 ou 15896 si tu ouvre le fichier avec note pad)...

    Sans compter que l'écriture des chaines de caractères (telles que nom et bidul dans l'exemple de structure) s'arretera au premier '\0' rencontré.

    Tu ne seras donc jamais sur que, le fait de sauter de "sizeof(tontype)" t'enverra correctement au début de ta structure.

    Et tu sera obligé de parcourrir ton fichier de manière purement séquentielle (si tu veux accéder au troisième élément, tu devras lire trois fois "un entier (pour lire machin), une chaine de caractère (pour lire nom), un deuxieme entier (pour lire truc) et une deuxième chaine de caractères (pour lire bidul)"...voire, éventuellement, dans un ordre différent si tu as décidé de l'enregistrer dans un ordre différent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par koala01
    Mais ce n'est pas la seule différence, ainsi que je l'ai signalé...

    <snip>

    deux choses qui seront impossible si tu ouvre ton fichier avec un mode basé sur "<*>t",(ou l'étoile est r, w ou n'importe quoi s'adaptant à un mode d'ouverture) pour la simple et bonne raison que machin et truc
    L'ouverture en mode texte, en C standard, se fait avec "r" (ou "w", "a", etc.) pas avec "rt". Le "t" est une extension de certains compilateurs (Borland et Microsoft essentiellement) et, sauf utilisation d'autres extensions, cette extension n'est pas utile.

    Citation Envoyé par koala01
    (les deux entiers dans la structure) auront toujours la meme taille (sizeof(int)) si le fichier est ouvert en binaire, mais auront une taille dépendant de la valeur (entre 1 et 10 caractère, si l'on considère les int comme étant codés sur 32bits) si tu l'ouvre en mode "texte"...

    <snip>

    Quand tu ouvre un fichier en mode "texte" ("rt","wt"...) tes nombres seront écrits sous la forme de chaine de caractères (tu verras 1, 123 ou 15896 si tu ouvre le fichier avec note pad)...

    Sans compter que l'écriture des chaines de caractères (telles que nom et bidul dans l'exemple de structure) s'arretera au premier '\0' rencontré.
    Rien a voir ave le mode d'ouverture. C'est la facon d'ecrire qui change dans ton explication, dans un cas tu ecris un entier, dans l'autre cas tu ecris la representation "chaine de caractere" de ce nombre. Si tu ecris ton nombre sous forme d'une chaine de caractere, il occupera la meme place dans un fchier binaire ou texte.

  16. #16
    Nouveau membre du Club Avatar de tchalkost
    Inscrit en
    Juillet 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 102
    Points : 35
    Points
    35
    Par défaut
    Merci pour vos réponses cela ma beaucoup aidé.

    Bah en faite j'ai fais le test d'ouvrir mon fichier en lecture normale "r" et en binaire "rb" et les deux méthodes ont fontionné. Bon a part la particularité expliqué par koala01:
    koala01 a dit:
    Quand tu ouvre un fichier en mode "binaire" ("rb", "wb"...) tu ouvre ton fichier en "acces direct" (cf démonstration ci-dessus)

    Tu peux donc décider de le parcourrir dans n'importe quel sens, de sauter n'importe quel nombre d'élément(s) pour autant que tu en connaisse leur taille, que ce soit vers l'avant ou vers l'arrière...
    Et je crois surtout que mon plus gros problème venait du faite que je n'avais pas ouvert mon fichier source en lecture avant. Je viens de revoir mon prog et il n'y avait que le fichier de destination ouvert en ecriture.
    Le truc qui me fous la rage plus qu'autre chose se sont les fautes d'inatention . Mais bon c'est passé faut passer a autre chose.

    //----------------------------------------------------------------------------------------//

    Bon j'aurais une dernière question a vous poser, cette fois-ci elle concerne le nom du fichier. Actuellement le nom du fichier que je recherche est composé d'une racine fixe, de la date recherché, d'une série de chiffre et de son extension.

    "PrelvCFRA-77890285415-"+"daterecherche"+"-sériechiffre"+".dvi"

    Dans mon prog lorsque je recherche le fichier en question je compose le nom du fichier en question je m'y prends de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    strncpy (nomfic_srcPCA, "PrelvCFRA-77890285415-", BUFSIZ);
    strncat (nomfic_srcPCA, daterecherche, sizeof(daterecherche)+1);
    strncat (nomfic_srcPCA, seriechiffre, 10);
    strncat (nomfic_srcPCA, ".dvi", 4);
    printf("%s\n", nomfic_srcPCA);
    //Je voudrais si possible effectuer une recherche juste sur
    //la racine fixe + datereche
    Donc dans mon prog lui dire que si le fichier recherché n'est composé que de la racine ansi que de la date recherche, ça lui suffise pour continué dans mon prog. Même sans l'extension cela ne me gêne pas.

    Comment pourrais-je réalisé cet subtilité ?
    Merci d'avance pour vos réponses

    PS:J'espère avoir été assez claire, je ne met pas le code du programme en intégralité je ne pense pas que cela soit nécessaire.
    PEACE AND LOVE !

  17. #17
    Nouveau membre du Club Avatar de tchalkost
    Inscrit en
    Juillet 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 102
    Points : 35
    Points
    35
    Par défaut
    Bonjour je me permet de relancer mon sujet concernant la composition du nom de mon fichier.

    Merci
    PEACE AND LOVE !

  18. #18
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    sprintf() est ton ami

  19. #19
    Nouveau membre du Club Avatar de tchalkost
    Inscrit en
    Juillet 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 102
    Points : 35
    Points
    35
    Par défaut
    Bonjour!
    Si j'ai bien compris la fonctionnalité du sprintf() c'est pour faire une écriture formaté.

    Moi dans mon cas je ne peux pas toucher au nom du fichier que je recherche celui-ci aura comme formatage :
    Nom1=
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Racine_fixe"-"Date_recherche"-"Série_chiffre"-"extension"
    Et donc dans mon prog lorsque je reconstitue le nom du fichier que je veux chercher je le fais de la manière suivante :
    Nom2=
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Racine_fixe"-"Date_recherche"
    Lorsque je fais la comparaison on remarque bien entendu que je n'est pas le même formatage pour mes deux noms. Comment je fais dans ma condition pour dire si le Nom2 == Nom1. Cela implique bien entendu que la série de chiffre et l'extension du fichier ne soit pas pris en compte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Traitement du nom du fichier
    strncpy (nomfic_srcPCA, "O:\\EKER\\Copie_Fic\\PrelevementCRCAVALFRA-77890285415-", TEMP);
    strncat (nomfic_srcPCA, daterecherche, sizeof(daterecherche)+1);
     
    //Ouverture du fichier en mode lecture, pour verifier son existance
    srcPCA = fopen(nomfic_srcPCA, "r");
    Dans mon code si j'ouvre mon fichier qu'avec le Nom2 je ne peux pas le faire car pour lui il va lui manquer la série de chiffre ainsi que l'extension. Et c'est justement sur ca que je veux jouer. On ne peut pas lui dire de que dans le Nom1 le nom du fichier s'arrête après la date recherché ????

    Je ne trouve pas mon bonheur avec sprintf(), je craint que ce ne soit un faux ami
    PEACE AND LOVE !

  20. #20
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Salut,
    Je n'arrive pas à comprendre ce que tu veux faire.

    Pour concaténer des éléments (chaînes, entiers, etc.), le plus simple est d'utiliser sprintf (voire snprintf si possible). Cela te permettra d'obtenir un nom partiel pour ton fichier (par exemple la partie "Racine_fixe-Date_recherche").

    Pour rechercher un fichier sans connaître son nom complet, tu peux lister tous les fichiers du répertoire jusqu'à en trouver un qui corresponde au nom partiel dont tu disposes (cf. par exemple scandir).

    La fonction strcmp permet de comparer deux chaînes (si possible, utilises plutôt strncmp qui permet de ne comparer que les n premiers caractères), et donc de vérifier si le nom partiel dont tu disposes correspond à l'un des noms du répertoire scanné.
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/04/2009, 14h14
  2. Lire un fichier binaire autant qu'un text
    Par bs.box dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2008, 04h53
  3. Réponses: 2
    Dernier message: 20/11/2006, 18h37
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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