none
Ecrire un tableau de string dans un fichier d'un seul coup RRS feed

  • Question

  • Bonjour à tous
     
    tout est dans le titre .
    j'ai trouvé une fonction qui permet de lire un fichier texte d'un seul
    tenant :
     
    Private Function ReadFileToBuffer(ByVal szFileName As String, _
                                     ByRef errCode As Integer, _
                                     ByRef errString As String) As String
        Dim F As Integer
        Dim Buffer As String
     
        ' trappe les erreurs
        On Error GoTo ReadFileToBuffer_ERR
     
        ' Ouverture du fichier en 'Binary'
        F = FreeFile
        Open szFileName For Binary As #F
            ' préallocation d'un buffer à la taille du fichier
            Buffer = Space$(LOF(F))
            ' lecture complète du fichier
            Get #F, , Buffer
        Close #F
        ReadFileToBuffer = Buffer
    ReadFileToBuffer_END:
        Exit Function
     
    ReadFileToBuffer_ERR:
        ' Gestion d'erreur
        ReadFileToBuffer = ""
        errCode = Err.Number
        errString = Err.Description
        Resume ReadFileToBuffer_END
    End Function
     
    Y a t'il la même chose pour écrire car j'ai un tableau de 16000 lignes et si
    je peux éviter de les saisir une par une cela m'irait bien
     
    merci
     
    Driss
     
     
     

    Drissou
    mercredi 20 octobre 2010 14:06

Réponses

  • Hello Driss,

     

    Cruelle omission en effet :-)

     

    Voici chose réparée :

     

    Private Function WriteArrayToFile(t() As String, ByVal filename As String, _
             ByVal sep As String, ByVal base As Long, _
             ByRef ErrDescription As String) As Boolean
    Dim buffer  As String
    Dim f   As Integer
    
     On Error GoTo WriteArrayToFileERR
    
     buffer = Join(t, sep)
    
     If base = 1 Then
      buffer = Mid$(buffer, Len(sep) + 1)
     End If
    
     f = FreeFile
     Open filename For Binary As #f
      Put #f, , buffer
     Close #f
     WriteArrayToFile = True
     
    WriteArrayToFileEND:
     Exit Function
     
    WriteArrayToFileERR:
     ErrDescription = Err.Description & " (" & Trim$(Str$(Err.Number)) & ")"
     WriteArrayToFile = False
     Resume WriteArrayToFileEND
    End Function
    

     

     

    Et pour l'utilisation, voici par exemple un appel avec un CRLF comme séparateur:

     

    <br/>
    
    Private Const N_LIGNES As Long = 10
    
    Private Sub Command1_Click()
    
    Dim t(N_LIGNES) As String
    Dim i   As Long
    
    Dim bRet  As Boolean
    Dim errDesc  As String
    
     For i = 1 To N_LIGNES
      t(i) = String$(20, Chr$(64 + (i Mod 26)))
     Next i
     
     bRet = WriteArrayToFile(t(), "c:\test.dat", vbCrLf, 1, errDesc)
    
     If Not bRet Then
      MsgBox "erreur lors de l'appel à WriteArrayToFile." & vbCrLf & errDesc
     Else
      MsgBox "tableau copié"
     End If
    
    End Sub
    

     

    NOTE: J'ai écrit et testé ça en 5 minutes, mais ça semble fonctionner - En tout état de cause, le principe est la.

    Le paramètre base te permet de dire si ton tableau commence à 0 ou à 1. En effet, le Join considère toujours qu'on commence à l'élément zéro, ce qui peut te créer une ligne vide en début de fichier. Donc si tes tableaux commencent à l'indice 1, tu passes simplement 1 comme paramètre (comme dans l'exemple) et la fonction s'occupe de tout.

     

    Bonne soirée !!

     

    Cordialement,

     

     


    Jean-marc
    • Proposé comme réponse EhJoe samedi 23 octobre 2010 11:26
    • Marqué comme réponse Alex Petrescu lundi 25 octobre 2010 16:53
    mercredi 20 octobre 2010 18:41

Toutes les réponses

  • Bien sur cette source provient de l'EXCELLENT site FAQ Vb http://faq.vb.free.fr/
     
    mais je n'ai pas vu l'action inverse
     
     
    Bonjour à tous
     
    tout est dans le titre .
    j'ai trouvé une fonction qui permet de lire un fichier texte d'un seul
    tenant :
     
    Private Function ReadFileToBuffer(ByVal szFileName As String, _
                                     ByRef errCode As Integer, _
                                     ByRef errString As String) As String
        Dim F As Integer
        Dim Buffer As String
     
        ' trappe les erreurs
        On Error GoTo ReadFileToBuffer_ERR
     
        ' Ouverture du fichier en 'Binary'
        F = FreeFile
        Open szFileName For Binary As #F
            ' préallocation d'un buffer à la taille du fichier
            Buffer = Space$(LOF(F))
            ' lecture complète du fichier
            Get #F, , Buffer
        Close #F
        ReadFileToBuffer = Buffer
    ReadFileToBuffer_END:
        Exit Function
     
    ReadFileToBuffer_ERR:
        ' Gestion d'erreur
        ReadFileToBuffer = ""
        errCode = Err.Number
        errString = Err.Description
        Resume ReadFileToBuffer_END
    End Function
     
    Y a t'il la même chose pour écrire car j'ai un tableau de 16000 lignes et si
    je peux éviter de les saisir une par une cela m'irait bien
     
    merci
     
    Driss
     
     
     

    Drissou

    Drissou
    mercredi 20 octobre 2010 14:19
  • Hello Driss,

     

    Cruelle omission en effet :-)

     

    Voici chose réparée :

     

    Private Function WriteArrayToFile(t() As String, ByVal filename As String, _
             ByVal sep As String, ByVal base As Long, _
             ByRef ErrDescription As String) As Boolean
    Dim buffer  As String
    Dim f   As Integer
    
     On Error GoTo WriteArrayToFileERR
    
     buffer = Join(t, sep)
    
     If base = 1 Then
      buffer = Mid$(buffer, Len(sep) + 1)
     End If
    
     f = FreeFile
     Open filename For Binary As #f
      Put #f, , buffer
     Close #f
     WriteArrayToFile = True
     
    WriteArrayToFileEND:
     Exit Function
     
    WriteArrayToFileERR:
     ErrDescription = Err.Description & " (" & Trim$(Str$(Err.Number)) & ")"
     WriteArrayToFile = False
     Resume WriteArrayToFileEND
    End Function
    

     

     

    Et pour l'utilisation, voici par exemple un appel avec un CRLF comme séparateur:

     

    <br/>
    
    Private Const N_LIGNES As Long = 10
    
    Private Sub Command1_Click()
    
    Dim t(N_LIGNES) As String
    Dim i   As Long
    
    Dim bRet  As Boolean
    Dim errDesc  As String
    
     For i = 1 To N_LIGNES
      t(i) = String$(20, Chr$(64 + (i Mod 26)))
     Next i
     
     bRet = WriteArrayToFile(t(), "c:\test.dat", vbCrLf, 1, errDesc)
    
     If Not bRet Then
      MsgBox "erreur lors de l'appel à WriteArrayToFile." & vbCrLf & errDesc
     Else
      MsgBox "tableau copié"
     End If
    
    End Sub
    

     

    NOTE: J'ai écrit et testé ça en 5 minutes, mais ça semble fonctionner - En tout état de cause, le principe est la.

    Le paramètre base te permet de dire si ton tableau commence à 0 ou à 1. En effet, le Join considère toujours qu'on commence à l'élément zéro, ce qui peut te créer une ligne vide en début de fichier. Donc si tes tableaux commencent à l'indice 1, tu passes simplement 1 comme paramètre (comme dans l'exemple) et la fonction s'occupe de tout.

     

    Bonne soirée !!

     

    Cordialement,

     

     


    Jean-marc
    • Proposé comme réponse EhJoe samedi 23 octobre 2010 11:26
    • Marqué comme réponse Alex Petrescu lundi 25 octobre 2010 16:53
    mercredi 20 octobre 2010 18:41
  • Bonjour,

     

    Merci Jean-Marc pour avoir ajouté les informations nécessaires. Drissou, je vous prie de nous tenir au courant si cette solution fonctionne pour vous.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    jeudi 21 octobre 2010 11:43
  • Bonjour Alex et Jean Marc
     
    ayant été absent quelques jours, je me reconnecte.
     
    je ne doute pas que ce code fonctionne.
    je vais le tester tout de suite.
     
    merci
     
    <Alex Petrescu> a écrit dans le message de news: 1e89ee55-ecf5-448a-a924-d2516fd93b04@communitybridge.codeplex.com...

    Bonjour,

     

    Merci Jean-Marc pour avoir ajouté les informations nécessaires. Drissou, je vous prie de nous tenir au courant si cette solution fonctionne pour vous.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA �?? Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 


    Drissou
    jeudi 28 octobre 2010 07:53
  • Hello,

    juste pour info, j'ai pris le temps de faire un petit test de performance pour comparer "ma" méthode et une méthode plus classique (simple parcours du tableau et écrite ligne à ligne avec print et fichier ouvert en output.

    Bilan: la méthode que j'ai proposé est exactement 2 fois plus rapide : 75 ms contre 150 ms, pour un tableau de 32000 lignes de 128 caractères [compilé en release et mesuré proprement avec QueryPerformanceCounter].

    Bonne journée !

    Cordialement,

     

     


    Jean-marc
    vendredi 29 octobre 2010 08:30
  • Bonjour,

     

    Merci M. Noury pour le suivi de ce problème J

     

    Cordialement,


    Alex

     

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    vendredi 29 octobre 2010 08:33
  • Bonjour jean Marc
     
    je viens enfin de tester en situation ta fonction Tableau vers Fichier.
    Très bien.
     
    Merci
     
    Driss
    "Jean-marc Noury" <=?utf-8?B?SmVhbi1tYXJjIE5vdXJ5?=> a écrit dans le message de news: fd678efe-a85b-4a44-83a0-c24ba3d70751...

    Hello,

    juste pour info, j'ai pris le temps de faire un petit test de performance pour comparer "ma" méthode et une méthode plus classique (simple parcours du tableau et écrite ligne à ligne avec print et fichier ouvert en output.

    Bilan: la méthode que j'ai proposé est exactement 2 fois plus rapide : 75 ms contre 150 ms, pour un tableau de 32000 lignes de 128 caractères [compilé en release et mesuré proprement avec QueryPerformanceCounter].

    Bonne journée !

    Cordialement,

     

     


    Jean-marc

    Drissou
    lundi 6 décembre 2010 11:05
  • Hello Driss,

     

    Merci du retour d'info :-)

     

    Bonne journée,

     

    Cordialement,

     


    Jean-marc
    lundi 6 décembre 2010 11:41