Boucle For & Streamreader

[Résolu]
Signaler
Messages postés
3
Date d'inscription
dimanche 4 novembre 2007
Statut
Membre
Dernière intervention
20 octobre 2008
-
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
-
Salut à tous,
je débute sur VB.NET et j'ai bientôt terminé mon application et il ne me reste plus qu'a programmer l'écriture ( et la lecture ) de mes données ( dont beaucoup de tableaux ) dans divers fichiers *.txt.

J'ai pourtant lu un paquet de trucs sur les streamwriter et streamreader, ( et dailleur merci aux personnes ayant proposé des sources sur le sujet ), et j'arrive donc à enregistrer des variables simples dans un fichier.
Mais maintenant mon soucis se pose sur les tableaux... j'utilise des boucles for pour les enregistrer et pour les lire,

Voici mon code :

Dim nombre_max As Integer = 5
Dim montableau(nombre_max) As Integer

Public Sub Save()
    Dim SW As StreamWriter = File.CreateText("data\monfichier.txt")
    SW.WriteLine(nombre_max)
    For i = 0 To (nombre_max - 1)
        SW.WriteLine(monTableau(i))
        Next
        SW.Close()
End Sub
'
' Ici j'ai bien les valeurs 5 0 0 0 0 0 écrites dans monfichier.txt
'

Public Sub Read()
    Dim SR As StreamReader = File.OpenText("data\monfichier.txt")
    nombre_max = SR.ReadLine()
        For i = 0 To (nombre_max - 1)
        monTableau(i) = SR.ReadLine()
        Next
        SR.Close()
End Sub
'
' A la lecture des valeurs 5 0 0 0 0 0 dans monfichier.txt
' la boucle for arrive à traiter montableau(i=0)
' mais à partir de montableau(i=1) la lecture se bloque
' à ce niveau 5 0 * * * * et j'ai une erreur :
' "L'exception IndexOutOfRangeException n'a pas été gérée
' L'index se trouve en dehors des limites du tableau."
'

La variable nombre_max se lit sans aucun soucis, en revanche ma variable monTableau() bug à la lecture... Pouvez-vous m'éclairer dans mon erreur afin de trouver une solution le + rapidement possible ?
Merci aux personnes qui liront mon code ;)
Bye

6 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
nombre_max est une constante avec cette déclaration
Dim nombre_max As Integer = 5

Il semble donc inutile de la relire dans la procédure Read.

NOTE:  Dim montableau(nombre_max) As Integer
Est un tableau à 6 éléments. pourquoi ne travailler qu'avec 5???

es tu sur que le problème vienne de là? car je n'ai pas d'erreur lors de l'exécution de ton code.

@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
3
Date d'inscription
dimanche 4 novembre 2007
Statut
Membre
Dernière intervention
20 octobre 2008

Salut jrivet, merci de ta réponse.
A vrai dire dans mon projet je n'assigne pas de 5 à ma variable nombre_max  , là j'ai rajouté le 5 pour qu'on comprenne d'ou vient les 0 0 0 0 0 écrits dans monfichier.txt

Dans mon projet je déclare :

Public nombre_max As Integer
' dans un module 1

Public  montableau(nombre_max) As Integer
' dans un module 2

Public Sub Read()
' dans un module 3

A ton observation :
nombre_max est une constante avec cette déclaration
Dim nombre_max As Integer = 5
Il semble donc inutile de la relire dans la procédure Read.

>>> nombre_max est bien une variable... ( je m'excuse pour le = 5 maladroit qui déforme la réalité : pardon )

A ton observation :
NOTE:  Dim montableau(nombre_max) As Integer
Est un tableau à 6 éléments. pourquoi ne travailler qu'avec 5???
>>> nombre_max est une variable de compteur et elle compte de manière standard ( elle compte en commencant par 1 et non par 0 ) Dans la réalité il a 5 éléments physique mais dans VB le dernier élément de mon tableau est monTableau((nombre_max 5) - 1 4 )

Merci pour ta réponse julien, ce qui me rassure c'est qu'à priori mon code fonctionne bien chez toi... mais pourquoi me sort-il cette erreur d'index a partir de la lecture du second élément du tableau ?

Merci pour vos réponses
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,

NON non , dans une déclaration
Dim montableau(nombre_max) As Integer  ou nombre_max vaut 5  ton tableau possède 6 éléments  Dim montableau(0 TO nombre_max) As Integer 
@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
3
Date d'inscription
dimanche 4 novembre 2007
Statut
Membre
Dernière intervention
20 octobre 2008

Ah ok je pige !

Que me conseil tu de faire ?
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Ah bah la si nombre_max n'est pas une constante je me retrouve bien avec la meme erreur

Il faut que tu redimensionnes ton tableau

Public Sub Read()
   Dim SR As StreamReader = File.OpenText("C:\monfichier.txt")
   nombre_max = SR.ReadLine()
   Array.Resize(montableau, nombre_max)
   For i = 0 To (nombre_max - 1)
       monTableau(i) = SR.ReadLine()
   Next
   SR.Close()
End Sub<hr />, ----
[../code.aspx?ID=41455 By Renfield]

@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
Bonjour, perso j'utilise le streamreader de cette façon et j'en suis très satisfait

''' <summary>

''' pour ne jamais avoir d'erreur à la lecture d'un fichier texte

''' </summary>

''' <remarks></remarks>

Public
Sub Read()

Dim line
As
String =
String.Empty

Try

Using SR
As
New StreamReader(
"data\monfichier.txt")

Doline = SR.ReadLine

'ton traitement ici

Loop
Until
Not line
Is
Nothing

' on arrete la lecture quand il n'y a plus rien

End
Using

Catch ex
As Exception

'quelle erreur???MsgBox(ex.Message)

End
Try

' voila c'est fini

End
Suba+