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++/CLI Discussion :

Enregistrer depuis un SaveFileDialog crée le fichier mais n'ecrit rien dedans


Sujet :

C++/CLI

  1. #1
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut Enregistrer depuis un SaveFileDialog crée le fichier mais n'ecrit rien dedans
    Rebonjour,
    Voici mon code (il provient de : http://msdn.microsoft.com/en-us/libr...iledialog.aspx) :

    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
    private:
       void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ )
       {
          Stream^ myStream;
          SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
          saveFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
          saveFileDialog1->FilterIndex = 2;
          saveFileDialog1->RestoreDirectory = true;
          if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
          {
             if ( (myStream = saveFileDialog1->OpenFile()) != nullptr )
             {
    
                // Code to write the stream goes here.
                myStream->Close();
             }
          }
       }
    Résultat, il m'affiche 5 erreurs :

    Erreur 6 error C2227: la partie gauche de '->Close' doit pointer vers un type class/struct/union/générique c:\documents and settings\utilisateur\mes documents\visual studio 2008\projects\heroes v trigger editor\heroes v trigger editor\Form1.h 2382

    Erreur 2 error C2065: 'Stream' : identificateur non déclaré c:\documents and settings\utilisateur\mes documents\visual studio 2008\projects\heroes v trigger editor\heroes v trigger editor\Form1.h 2371

    Erreur 3 error C2065: 'myStream' : identificateur non déclaré c:\documents and settings\utilisateur\mes documents\visual studio 2008\projects\heroes v trigger editor\heroes v trigger editor\Form1.h 2371

    Erreur 4 error C2065: 'myStream' : identificateur non déclaré c:\documents and settings\utilisateur\mes documents\visual studio 2008\projects\heroes v trigger editor\heroes v trigger editor\Form1.h 2371

    Erreur 5 error C2065: 'myStream' : identificateur non déclaré c:\documents and settings\utilisateur\mes documents\visual studio 2008\projects\heroes v trigger editor\heroes v trigger editor\Form1.h 2371
    Je comprends ces erreurs. Alors, je corrige le tout, j'enlève carrément les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream^ myStream; myStream->Close();
    et le début de ligne "myStream = "

    Maintenant, le programme se lance correctement. Mais quand j'enregistre depuis ce dialogue, et que je vais voir après le fichier que j'ai enregistré, rien n'y est... Il est totalement blanc, alors qu'il y avait des choses écrites dans la richtextbox.

    Peut-être faut-il lier la richtextbox avec ce dialogue, pour qu'il sache ce qu'il faut enregistrer ? Quoi qu'il en soit, je n'ai encore rien trouvé

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    si tu supprimes l'écriture dans le stream, c'est normal qu'il n'y ait rien dedans.

    A mon avis, tes erreurs proviennent du fait que t'as oublié un namespace. Il faut également enregistrer manuellement le contenu de ton richtextbox

  3. #3
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Merci
    Le problème, c'est que je n'ai pas de namespace... J'ai pourtant "includé" fstream et iostream. Mais cela ne change rien. Et dans System ou std, je ne trouve aucun 'Stream'.

    Puis aussi, comment sa enregistrer manuellement ? J'avais fait un truc très 'manuel', avec deux textbox où l'utilisateur devait indiquer le nom et le chemin du fichier à enregistrer. Cela fonctionnait très bien, mais ce n'était pas à l'épreuve des erreurs de manip, et surtout ce n'était pas très... professionnel.

    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
    69
    70
    71
    72
    73
    74
    private: System::Void BoutonEnregistrer_Click(System::Object^  sender, System::EventArgs^  e) {
                 //SAVE CURRENT FILE
                this->ProgressBar1->Value = 22;
                this->TexteStatutVAR->Text = "Création du fichier de sauvegarde...";
                Application::DoEvents();
                if (this->FileNameBox->Text == "")
                {
                    this->FileNameBox->Text = "Untitled";
                    BOOL MessageBeep(MB_ICONEXCLAMATION); 
                    MessageBox::Show("Vous n'aviez pas précisé de nom pour votre fichier. Par défaut, il a été nommé 'Untitled'.", "Information", MessageBoxButtons::OK, MessageBoxIcon::Information); 
                }
                if (this->PathNameBox->Text == "")
                {
                    this->PathNameBox->Text = "Redacted triggers\\\\";
                    BOOL MessageBeep(MB_ICONEXCLAMATION); 
                    MessageBox::Show("Vous n'aviez pas précisé de dossier où stocker votre fichier. Par défaut, \nle fichier va être enregistré dans \\Redacted triggers\\ (présent dans le dossier d'installation du programme).", "Information", MessageBoxButtons::OK, MessageBoxIcon::Information); 
                }
                    //First settings
                 System::String ^PathNameS, ^FileNameS, ^MyFileS;
                 PathNameS = this->PathNameBox->Text;
                 FileNameS = this->FileNameBox->Text;
                 MyFileS = (PathNameS + FileNameS + ".trig");
     
                 //Variables and Other
                 FILE *fichier1;
     
                 //Store Current text
                 System::String ^Text2SaveSTRING = this->TriggersRedactionSpace->Text;
     
                this->ProgressBar1->Value = 45;
                this->TexteStatutVAR->Text = "Enregistrement des informations...";
                Application::DoEvents();
                 //Convert in usable characters table
                 char *Text2Save = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(Text2SaveSTRING).ToPointer());
                 char *MyFile = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(MyFileS).ToPointer());
     
                 //Open Save Dialog
     
                 //Open file to put stored text in it /--\ CHANGE "FILENAME" !
                 fichier1 = fopen(MyFile, "w");
     
                this->ProgressBar1->Value = 75;
                this->TexteStatutVAR->Text = "Ouverture du fichier...";
                Application::DoEvents();
     
                //If the file exist, re-write over it the stored text
                if(is_readable(MyFile))
                    {
                    this->ProgressBar1->Value = 100;
                    this->TexteStatutVAR->Text = "Écriture du fichier *.trig...";
                    Application::DoEvents();
                    fprintf(fichier1, Text2Save);
                    fclose(fichier1);
                    }
                else
                    {
                    this->ProgressBar1->Value = 0;
                    this->TexteStatutVAR->Text = "Erreur lors de la vérification !";
                    Application::DoEvents();
                    BOOL MessageBeep(MB_ICONEXCLAMATION); 
                    System::Windows::Forms::MessageBox::Show("Erreur lors du test de l'ouverture du fichier. La procédure de sauvegarde a été annulée : veuillez recommencer.\nSi l'erreur persiste, le mieux est de créer manuellement un fichier .txt où vous copiez-collez votre code.", "Sauvegarde non effectuée", MessageBoxButtons::OK, MessageBoxIcon::Warning); 
                    }
     
                //Clean memory
                System::Runtime::InteropServices::Marshal::FreeHGlobal(safe_cast<IntPtr>(Text2Save));
     
                //END SAVE CURRENT FILE
                this->ProgressBar1->Value = 0;
                this->TexteStatutVAR->Text = "Fichier enregistré avec succès !";
                Application::DoEvents();
                System::Threading::Thread::Sleep(2000);
                this->TexteStatutVAR->Text = "Prêt";
                Application::DoEvents();
             }

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Les stream se trouvent dans le namespace System.IO, voir dans la faq http://dotnet.developpez.com/faq/cpp...ge=file#rwtext
    Utiliser une SaveFileDialog est une bonne idée, mais c'est après avoir indiqué le fichier qu'il faut écrire dedans http://nico-pyright.developpez.com/t...opensaveDialog.

  5. #5
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Désolé, mais je ne comprends strictement rien à ton article sur l'écriture d'un fichier texte. Comment obtenir le nom de fichier saisi par l'utilisateur dans la boîte de dialogue ? Je ne veux pas que tous les fichiers s'appellent monfichier...
    Comment passer du stream à un string qui remplacera l'existant du fichier déjà créé ?
    Et puis l'intellisense ne reconnait pas File::Exists(...).
    Déjà, qu'est-ce qu'un stream ou flux ? C'est un fichier ? Comment on écrit dans le fichier à partir d'un flux ?

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    un petit exemple vaut mieux qu'un long discours

    crée un nouveau projet
    Fais glisser un textbox multiligne sur ta form
    un bouton
    un savefiledialog

    ensuite, sur le clique du bouton (qui sert à enregistrer bien sur ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    {
    	saveFileDialog1->Title = "Sélectionnez un fichier";
    	saveFileDialog1->FileName = nullptr;
    	saveFileDialog1->DefaultExt = "txt";
    	saveFileDialog1->Filter = "Fichiers Texte (*.txt)|*.txt|Tous (*.*)|*.*";
    	if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    	{
    		Stream ^s = saveFileDialog1->OpenFile();
    		StreamWriter ^sw = gcnew StreamWriter(s);
    		sw->Write(textBox1->Text);
    		sw->Close();
    	}
    }

  7. #7
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    AAAAAAAAAh merci beaucoup
    Donc ça c'est pour sauvegarder SOUS. Mais pour sauvegarder bêtement alors ? On ne montre aucun dialogue, mais le fichier en cours est enregistré...

    Pour les openfile, je suppose que c'est pareil, non ?

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    si t'as le chemin, t'as pas besoin de tout le bouzin de savefiledialog

    tu ouvres un streamwriter avec le nom du fichier et le tour est joué

  9. #9
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Oui mais... le chemin, comment l'obtient-on ?

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    c'est à toi de le gérer le chemin
    je sais pas où tu veux l'enregistrer ...

  11. #11
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    A ça va j'ai trouvé : this->EnregProjetActuel->FileName->ToString() = chemin du fichier.

  12. #12
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    un petit exemple vaut mieux qu'un long discours

    crée un nouveau projet
    Fais glisser un textbox multiligne sur ta form
    un bouton
    un savefiledialog
    J'ai testé mais ça ne compile pas, je ne comprends pas pourquoi il y a ces erreurs :

    error C2065: 'Stream'*: identificateur non déclaré
    's'*: identificateur non déclaré
    'StreamWriter'*: identificateur non déclaré
    'sw'*: identificateur non déclaré
    erreur de syntaxe*: identificateur 'StreamWriter'
    la partie gauche de '->Write' doit pointer vers un type class/struct/union/générique
    la partie gauche de '->Close' doit pointer vers un type class/struct/union/générique
    Je n'arrive pas à résoudre ce problème, pouvez vous m'aider ?

    Merci d'avance !

    Thomas

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Manquerait pas un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using namespace System.IO
    par hasard ?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/04/2015, 17h23
  2. Créée des enregistrements depuis un formulaire
    Par marie10 dans le forum Access
    Réponses: 5
    Dernier message: 23/01/2006, 11h59
  3. Macro depuis word qui ferme un fichier excel
    Par max2245 dans le forum VBA Word
    Réponses: 7
    Dernier message: 13/01/2006, 10h57
  4. L'utilisateur peut créer un fichier mais pas l'effacer
    Par crakazoid dans le forum Administration système
    Réponses: 2
    Dernier message: 22/11/2005, 08h45
  5. Réponses: 10
    Dernier message: 16/12/2004, 16h23

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