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 avec StreamReader sur la lecture d'un fichier texte


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 23
    Points : 10
    Points
    10
    Par défaut problème avec StreamReader sur la lecture d'un fichier texte
    Bonjour je suis en train de refaire un programme dans lequel j'ai énormément de GOTO. Pour essayé de les éliminer, j'ai fais des petite fonctions.
    Dans mon code pour un bouton j'ai
    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
     private void button1_Click(object sender, EventArgs e)
     {
         //définition des variables locale
         DialogResult r = DialogResult;
         // variable longueur pour la longueur du nom du fichier avec le chemin
         int longueur = 0;
         if (radioButton1.Checked == false && radioButton2.Checked == false && radioButton3.Checked == false && radioButton4.Checked == false)
         {
             MessageBox.Show("Vous n'avez pas choisi le type de processeur!", "ERREUR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
             return;
         }
         //ouverture du fichier à désassembler
         OpenFileDialog dlg = new OpenFileDialog();
         //affichage de la boite de dialogue ouverture de fichier
         dlg.Title = "Ouverture du fichier à désassembler";
     .......
     //création du constructeur de lecture du fichier à désassembler
     FileStream fs = new FileStream(fichier, FileMode.Open, FileAccess.Read);
     //création du lecteur
     StreamReader lecfic = new StreamReader(fs);
    Dans une fonction j'ai fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public void adok()
     {
         //lecture de la première ligne de code (entete)
         A = lecfic.ReadLine();
         //lecture de la deuxième ligne début du code
         A = lecfic.ReadLine();
         //positionnement sur le premier byte de la ligne commence à 0, 5 hexa soit 6 en décimale
         pb = 5;
         // vers la routine Boucle1
         Boucle1(); // goto Boucle1; //=====>
     }
    Lorsque j’exécute j'ai un message sur la première ligne A = lecfic.ReadLine(); Exception levée A = lecfic.ReadLine(); system.Nullreference exception : la référence d'objet n'est pas définie à une instance d'un objet.
    J'ai du oublier quelques chose ?? Je pense que les définitions du StreamReader sont perdue en quitant la fonction bouton1. Comment les faire suivre dans mes autres fonctions ????

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 298
    Points : 1 893
    Points
    1 893
    Par défaut
    bah, c'est quoi A ?
    sinon pour ta variable lecfic effectivement c'est un problème de portée, ici elle est déclarée dans ta fonction de click, donc n'existe plus à sa sortie.
    donc il faut la déclarer à l'extérieur de la fonction en public si nécessaire, ou peut-être mieux la passer en paramètre à cette fonction qui en a besoin.
    Ou encore, passer le nom du fichier a ta fonction et initié ton streamreader dans celle-ci (un commentaire indique que tu lis la 1ère ligne du fichier, or a priori, rien n'assure que l'on se trouverait au début du fichier à ce moment là)

  3. #3
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Comme dans adok() il accède directement à lecfic sans le déclarer, il est possible qu'il y ait une variable de ce nom déclarée sur la portée de la fenêtre. Mais comme dans le gestionnaire du bouton il redéclare une variable lecfic, celle-ci masque la variable globale qui, du coup, n'est pas initialisée.

  4. #4
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Bonjour, n'arrivant pas à faire, je reviens vers vous.
    J'ai fais
    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
     public void adok()
     {
         //lecture de la première ligne de code (entete)
         Lecture();
         //lecture de la deuxième ligne début du code
         Lecture();
         //positionnement sur le premier byte de la ligne commence à 0, 5 hexa soit 6 en décimale
         pb = 5;
         // vers la routine Boucle1
         Boucle1(); // goto Boucle1; //=====>
     }
     /// <summary>
     /// Routine lecture dans le fichier xxx.epr ou xxx.obj ou xxx.s19
     /// </summary>
     /// <returns></returns>
     
     public void Lecture()
     {
         //création de fs file stream pour la lecture
         FileStream fs = new FileStream(fichier, FileMode.Open, FileAccess.Read);
         //création du lecteur
         StreamReader lecfic = new StreamReader(fs);
         //lecture d'une ligne de code
         A = lecfic.ReadLine();
         //return A;
     }
    sans résultat je lis toujours la première lire du fichier en entré.
    A est une variable string qui me permet de récupérer une ligne dans le fichier en entrée. Fichier texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    0000 0F 7F 70 01 7F 70 03 7F 70 11 7F 70 13 7F 70 06
    0010 CE 00 04 FF 70 00 CE FF 1C FF 70 02 CE 00 05 FF
    Merci de m'aider

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    À chaque fois que tu appelles la fonction Lecture() tu ouvres le fichier et lis la première ligne. Il te faut ouvrir le fichier une fois et garder la même source après avoir ignoré la première ligne. Par ailleurs, tu peux récupérer le contenu du fichier sous forme de lignes avec un simple File.ReadLines ou File.ReadAllLines.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 298
    Points : 1 893
    Points
    1 893
    Par défaut
    A mon sens, il faut que tu comprennes ce que fait le programme et le refaire de zéro (ou presque) sans suivre la logique des goto, ça sera peut-être plus efficace, et à mon sens ici la fonction lecture n'a pas lieu d'être

  7. #7
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Bonjour, je pense avoir réussi ce que je voulais faire.
    Dans les définitions des variables j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     // définition pour la lecture de fichier
     private FileStream fs;
     public FileStream FS { get => fs; set => fs = value; } 
     // définition pour lecteur du fichier à désassembler
     private StreamReader sr;
     public StreamReader SR {  get => sr; set => sr = value; }
     // définition pour ecriture de fichier
     private FileStream ws;
     public FileStream WS {  get => ws; set => ws = value; }
     // définition pour écriture du fichier désassemblé
     private StreamWriter sw;
     public StreamWriter SW { get => sw; set => sw = value; }
    Dans le corps de mon bouton 1, j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     //création de fs file stream pour la lecture
     fs = new FileStream(fichier, FileMode.Open, FileAccess.Read);
     //création du lecteur
     SR = new StreamReader(fs);
     // variable longueur pour la longueur du nom du fichier avec le chemin
     int longueur = 0;
     //fichier égale la longueur du nom du fichier plus le passe moins les trois caractères de l'extension
     longueur = fichier.Length - 3;
     //création du chemin et du fichier *.dec en sortie contenant le désassemblage du fichier *.epr
     Fichier1 = string.Concat(fichier.Substring(0, longueur), "dec");
     //création du constructeur écriture du fichier de désassemblage
     ws = new FileStream(Fichier1, FileMode.Create, FileAccess.Write);
     //création du writer
     SW = new StreamWriter(ws);
    Maintenant lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public void adok()
     {
         //lecture de la première ligne de code (entete)
         A = SR.ReadLine();
         //lecture de la deuxième ligne début du code
         A = SR.ReadLine();
         //positionnement sur le premier byte de la ligne commence à 0, 5 hexa soit 6 en décimale
         pb = 5;
         // vers la routine Boucle1
         Boucle1(); // goto Boucle1; //=====>
     }
    , je récupère bien la première ligne de mon fichier texte dans ma variable string A puis la deuxième ligne.
    Merci pour vos suggestions et avec acharnement j'ai résolu mon problème.
    Je ferme le sujet.
    Cordialement ASTVT.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 258
    Points : 12 925
    Points
    12 925
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     //fichier égale la longueur du nom du fichier plus le path moins les trois caractères de l'extension
     longueur = fichier.Length - 3;
    Attention, tu pars de l'hypothèse que l'extension fait 3 caractères, ni plus ni moins.
    Or rien ne te garantie que ce sera toujours le cas.
    Tu devrais utiliser la classe Path pour gérer ceci, et plus explicitement Path.ChangeExtension() qui me semble tout indiqué ici.

    Tatayo.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 298
    Points : 1 893
    Points
    1 893
    Par défaut
    j'ai aussi du mal à voir pourquoi une variable publique et une variable privée. Si elle sont définies et utilisées uniquement dans la même portée (dans une classe par exemple), le doublon n'est pas nécessaire. Tu peux te contenter des variables privées si dans le même portée, sinon utilise les publiques (ou passe les en paramètres des fonctions)

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

Discussions similaires

  1. Question sur lecture d'un fichier text en Java
    Par ovcrash dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 27/11/2007, 17h14
  2. Probleme sur la lecture d'un fichier
    Par Iskander81 dans le forum C
    Réponses: 10
    Dernier message: 10/05/2007, 14h51
  3. Lecture d'un fichier texte avec ligne vide.
    Par cotcouture dans le forum Général Python
    Réponses: 2
    Dernier message: 06/10/2006, 02h54
  4. Réponses: 6
    Dernier message: 23/02/2006, 12h09
  5. Réponses: 2
    Dernier message: 28/12/2005, 15h00

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