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

Visual C++ Discussion :

taille du fichier


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut taille du fichier
    bonsoir
    j'ai crée un nombre de fichier dans un dossier,
    dans mon application et dans une boite dilaog j'affiche les noms de ces fichiers dans un Listbox
    je veux que lorsque je clique sur un nom , j'ouvre ce fichier et quand je clique sur un button creer ,je dois modifier les valeurs existant ds mon fichier(incrementer chaque valeur de 1)
    voici les sous programmes:

    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
     
    OOL CTatoCreePatchDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
     
    	// TODO: Add extra initialization here
    	CFileFind f;
    	  CString str;
     
    	//  str = m_pParent->m_repApp+"\\Marques\\BM*.*";
    	  str = m_pParent->m_repApp+"\\patchwork\\test*.*";
     
          BOOL bMoreFiles = f.FindFile(str);
     
    	  while (bMoreFiles){
                 bMoreFiles = f.FindNextFile();
     
    			 if (!f.IsDirectory())
    				 m_mfiles.AddString((LPCSTR)f.GetFileName() );;
    	  };
     
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    et la fonction qui select un nom:
    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
     
    void CTatoCreePatchDlg::OnSelchangeList1() 
    {
    	// TODO: Add your control notification handler code here
    	if(!m_marq.IsWindowEnabled())
           m_marq.EnableWindow(TRUE);
     
    	CString str1,str2;
    	int nindex = m_mfiles.GetCurSel();
        if((nindex != LB_ERR))  m_mfiles.GetText( nindex,str1);
     
    	FILE *f; 
     
      	str2.Format("c:\\tatouage\\patchwork\\%s",str1);
    	f=fopen(str2,"w" );
     
    }
    et dernierement la fonction qui dois modifient ces valeurs
    mais j'a pas encore traier, car je sais pas comment determiner la taille du fichier et incrementer ses valeurs entiers !!
    les données dsmes fichiers sont comme suit par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (5,98)-(180,11) 
    (434,74)-(529,95) 
    (993,48)-(974,90) 
    (437,72)-(102,29) 
    (101,10)-(604,74)
    donc je dois incrementer chaque valeur de 1
    puis j'ai le choix entre sauvgarder mon fichier par son non( çàd remplacer par le nouvel) soit creer un autre fichier et sauvegareder les nouvelle valeurs dedans
    est ce qq1 a une idée??

  2. #2
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut
    bonjour
    j'essaie d'écrire ce code
    est ce qq1 peut me le corriger
    ( supposons que lorsque je clique sur le nom du fichier sur la ListBox je l'ouvre
    )
    voici la fonction qui fait les traitements:
    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
     
    void CTatoCreePatchDlg::OnCree() 
    {
    	// TODO: Add your control notification handler code here
     
    // premirement on ouvre notre ficher en lecture( dans la fonction precedante)
    	int caractere = 0;
    	int cmp =0; //compteur qui va compter le nombre du caractere ds mon fichier
    	if (f != NULL)
    	{
        do
            {
                caractere = fgetc(f); // On lit le caractère
                cmp++;; // On compte
            } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
     
            fclose(f);
        }
    	int nb;
    	f=fopen(str2,"r+" );  // ici je sais pas comment j'ouvre ce meme fichier! est ce str2 reste memorisée 
    		if (f != NULL)
    	{
    			for( int i=0;i<cmp;i++)
    			{
    			fscanf ( f,"%d", &nb) ;     // ici je lis juste les nombres ds mon fichier
    			fprintf( f, "%d",&nb+1);     // ici je fais mon traitement, incrementer chaque nombre de 1
    			}
    		fclose(f);
    		}
    }
    je sais pas si correcte ou non??

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ton code, réindenté et quelque peu commenté:
    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
    void CTatoCreePatchDlg::OnCree() 
    {
    	// TODO: Add your control notification handler code here
     
    	// premirement on ouvre notre ficher en lecture( dans la fonction precedante)
    	/* Med: Tu veux dire f est une donnée membre de la classe?
    	   Ça ne se voir pas assez. 
    	   Et d'ailleurs, je pense que ça ne sert à rien. */
    	int cmp =0; //compteur qui va compter le nombre du caractere ds mon fichier
    	if(f != NULL)
    	{
    		/* Med: Déplacé. */
    		int caractere;
    		do
    		{
    			caractere = fgetc(f); // On lit le caractère
    			cmp++; // On compte
    			/* Med: corrigé le nom de variable. */
    		} while (caractere != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
     
    		fclose(f);
    	}
     
     
    	int nb;
    	// ici je sais pas comment j'ouvre ce meme fichier! est ce str2 reste memorisée 
    	/* Med: Je ne sais pas, c'est ton code, ça dépend de toi. */
    	f=fopen(str2,"r+" );
    	if(f != NULL)
    	{
    		for(int i=0 ; i<cmp ; i++)
    		{
    			fscanf ( f,"%d", &nb) ;     // ici je lis juste les nombres ds mon fichier
    			/* Med:
    			   1. Pas de & ici: C'est un nombre que tu écris, pas son adresse.
    			   2. Très mauvais. La taille du nombre peut changer. 
    			      Tu DOIS écrire dans un autre fichier, pas dans le même
    			      (ou alors, en forçant en toutes circonstances la taille du nombre). */
    			fprintf( f, "%d",&nb+1);     // ici je fais mon traitement, incrementer chaque nombre de 1
    		}
    		fclose(f);
    	}
    }
    PS: Essaie de bien indenter ton code quand tu postes... Dans l'état actuel, c'est très désagréable.
    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.

  4. #4
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut
    donc je dois d'abord copier les donnés de mon fichier dans un autre
    puis les modifient dedans ce dernier
    n'est ce pas???
    je vais esaier de nouveau

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce qu'on fait généralement, c'est écrire directement une copie modifiée du fichier sous un autre nom (en passant par un buffer en mémoire ou en écrivant directement au fur et à mesure), puis supprimer l'ancien fichier et renommer le nouveau...
    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.

  6. #6
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut
    moi j'ai copiée les données du mon fichier ds un autre( je le cree)
    puis je modifie dedans ce dernier
    j'ai pas suprimer l'ancien ( juste pour verifier ces les traitement que je fait est juste ou bien non)
    voici le 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
     
    void CTatoCreePatchDlg::OnCree() 
    {
    CString str1,str2,str3;
    int n= static_cast< CListBox * >(GetDlgItem(IDC_LIST1))->GetCurSel();
    // ici je reccupere le nom du fichier pour l'ouvrir
     
    if(n!=LB_ERR) static_cast< CListBox * >(GetDlgItem(IDC_LIST1))->GetText(n,str1);
     
     
    FILE *f,*g; 
    str2.Format("c:\\tatouage\\patchwork\\%s",str1); // ouvre premier fichier en lecture
    f=fopen(str2,"r" );
    if(!f)
    {
    printf("impossible d'ouvrir le fichier"); 
    }
     
    str3.Format("c:\\tatouage\\patchwork\\nov%s",str1); //cree un nouveau fichier qui porte le nom novstr1
    f=fopen(str3,"w" ); //ouvre le deuxieme fichier en ecriture
    if(!g)
    {
    printf("impossible d'ouvrir le fichier");
    }
     
     
    int cmp =0; //compteur qui va compter le nombre du caractere ds mon fichier
    if((f != NULL) & (g!=NULL))
    {
    /* Med: Déplacé. */
    int caractere;
    do
    {
    caractere = fgetc(f); // On lit le caractère
    fputc(caractere,g); //on ecrit ds le fichier g
    cmp++; // On compte
    /* Med: corrigé le nom de variable. */
    } while (caractere != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
     
    fclose(f);
    fclose(g);
    }
     
     
    int nb;
     
    g=fopen(str3,"r+" );
    if(g != NULL)
    {
    for(int i=0 ; i<cmp ; i++)
    {
    fscanf ( g,"%d", nb) ; // ici je lis juste les nombres ds mon fichier
    /* Med:
    1. Pas de & ici: C'est un nombre que tu écris, pas son adresse.
    2. Très mauvais. La taille du nombre peut changer. 
    Tu DOIS écrire dans un autre fichier, pas dans le même
    (ou alors, en forçant en toutes circonstances la taille du nombre). */
    fprintf( g, "%d",nb+1); // ici je fais mon traitement, incrementer chaque nombre de 1
    }
    fclose(g);
    }
    est ce que vous pouvez me le corriger?

  7. #7
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut
    quand j'execute mon code,mon programme se bloque , je sais pas pourquoi?
    le nouveau fichier a créée mais vide (0kb)

    j'initialise ts mes variables par 0
    donc est ce que j'ai mis une faute lors de copie des donnees!!!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu ne dois pas lire et écrire dans un même fichier alors que tu augmentes potentiellement la taille. Les gourous eux-mêmes ne font pas ça (il est possible aux gourous de le faire quand il n'y a aucun risque d'augmenter la taille).

    Tu dois lire de f et écrire sur g, et tu peux le faire au fur et à mesure (en une fois).
    PS: d'ailleurs, tu n'as même pas besoin de calculer à l'avance la taille du fichier, puisque:
    1. Elle risque d'augmenter
    2. Tu ne l'utilises pas...
    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.

  9. #9
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut
    j'ai le pobleme lors de copier d'un fichier à à l'aute
    j'ai fait tt en commentaire juste la partie qui me donne l'erreur
    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
     
    int cmp =0; //compteur qui va compter le nombre du caractere ds mon fichier
    	if((f != NULL) && (g!=NULL))
    	{
     
    	int caractere=0;
    	do
    	{
    	caractere = fgetc(f); // On lit le caractère
    	fputc(caractere,g); //on ecrit ds le fichier g
    	cmp++; // On compte
     
    	} while (caractere != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
     
    	fclose(f);
    	fclose(g);
    	}
    je sais pas pourquoi!!
    puis la deuxieme partie du mon code c d'ouvrir g, et lire juste les entiers pour puisse les modifient apres ( incrementer de 1)
    et je ferme ts
    mon fichier d'origine porte des donnees comme celle la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (0,17)-(14,10) 
    (17,11)-(8,16) 
    (6,11)-(3,17)
    j'espere que mon nouveau fichier conserve la meme format sauf les entiers qui seront incrementés

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On peut savoir quelle est l'erreur ?

    De plus, je ne connais pas le format de ton fichier. Si les données sont formattées avec des parenthèses etc., il faudra faire mieux qu'un simple fscanf("%d") pour les lires.
    PS: Je croyais t'avoir dit que la mesure de la taille était inutile...
    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.

  11. #11
    Membre éclairé Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par défaut
    encore une fois, j'ai modifiée les nstructions qui font le copier
    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
     
    	if((f != NULL) && (g!=NULL))
    	{
     
    	int caractere=0;
     
    	while( !feof(f))
    	{
    		fscanf(f,"%d",&caractere);
    		fprintf(g,"%d",caractere);
    	}
     
    	fclose(f);
    	fclose(g);
    	}
    mais lors de l'execution , le programme se bloque

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    As-tu vu le code non-testé de mon dernier post?
    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.

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

Discussions similaires

  1. [Socket][Byte] Probleme d'envoi d'une taille de fichier
    Par Erok dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 12/05/2009, 17h38
  2. Taille des fichiers Interbase et Firebird
    Par Equus dans le forum Débuter
    Réponses: 5
    Dernier message: 21/03/2005, 15h50
  3. [DOS] Obtenir la taille du fichier
    Par Amélie Ladoque dans le forum Windows
    Réponses: 2
    Dernier message: 15/02/2005, 12h33
  4. Taille de fichier
    Par nicolas.pissard dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/11/2003, 16h24
  5. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 09h41

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