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 :

Déclarer des chaînes de longueur fixe


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut Déclarer des chaînes de longueur fixe
    Bonjour

    Pour réaliser une structure, j’ai besoin de déclarer des « string » de longueur définie.

    Je ne l’ai pas trouvé dans l’aide sur les structures.
    Quelqu’un peut-il me dire comment les déclarer ?
    Merci de votre aide

    Claude Azoulai

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Le concept de taille de string a disparu dans .NET.

    Il faut passer par un StringBuilder pour retrouver ce comportement :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var sb =  new StringBuilder(10);
    sb.Append("0123456789");

    Si on rajoute des données après le 9 (donc si le string dépasse la longeur), je vais déclencher une exception.

    Il existe cependant une subtilité, qui consiste à utiliser l'attribut VBFixedStringAttribute, mais cela oblige à rajouter une référence à Microsoft.VisualBasic.

    Enfin, il est possible de passer par une propriété de type String, qui vérifie la longeur du string dans le setter. Si c'est trop long, on peut ensuite à loisir, tronquer ou lancer une exception.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,
    Citation Envoyé par DotNetMatt Voir le message
    Le concept de taille de string a disparu dans .NET.
    Hein ? Les string ont une taille. Que veux-tu dire ?
    Citation Envoyé par DotNetMatt Voir le message
    Il faut passer par un StringBuilder pour retrouver ce comportement
    Si on rajoute des données après le 9 (donc si le string dépasse la longeur), je vais déclencher une exception.
    Non. Le constructeur de StringBuilder qui prend un int en paramètre ne fait que spécifier la taille initiale du buffer, pas la taille maximale (cf la doc)

    Claude: quel est ton besoin ? Veux tu faire de la validation, pour t'assurer que tel propriété de tel object est une string d'une taille donnée ? Ou veux tu exporter ces string quelque part, dans un fichier ? Ou autre chose ?
    ಠ_ಠ

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Hein ? Les string ont une taille. Que veux-tu dire ?
    Ce que je veux dire c'est que les string ne peuvent pas avoir de taille prédéfinie. Un string est un string, qu'il fasse 1 ou 200 caractères. Tu ne peux pas dire "je veux que mon string ait une longueur X". Si tu mets X+1 caractères, le string va se redimensionner tout seul...


    Citation Envoyé par Guulh Voir le message
    Non. Le constructeur de StringBuilder qui prend un int en paramètre ne fait que spécifier la taille initiale du buffer, pas la taille maximale (cf la doc)
    Je n'ai pas parlé de taille maximale Avec un StringBuilder si tu dis que la taille c'est 9 alors tu auras une exception qui sera levée (ArgumentOutOfRangeException), ce qui te laisse toute latitude pour pouvoir agir en fonction de tes besoins en catchant l'exception (soit refuser les caractères supplémentaires, soit les ajouter par exemple).

    Le StringBuilder n'est qu'une solution parmi tant d'autre. En tout cas je persiste, on ne peut pas initialiser un string à taille fixe en .NET. Ou alors je suis curieux de savoir comment
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Si tu mets X+1 caractères, le string va se redimensionner tout seul...
    Les string ne se redimensionnent pas, ils sont immutables. Soyons précis

    Citation Envoyé par DotNetMatt Voir le message
    Avec un StringBuilder si tu dis que la taille c'est 9 alors tu auras une exception qui sera levée (ArgumentOutOfRangeException)
    Certes Là où je suis pas d'accord, ce'st que ce n'est pas avec ce constructeur là que l'on spécifie une taille max, c'est avec celui-ci.
    ಠ_ಠ

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Les string ne se redimensionnent pas, ils sont immutables. Soyons précis
    Effectivement l'explication était quelque peu confuse, j'ai eu un bug de vocabulaire.. Le mot immutable est resté coincé dans le buffer. Impossible de le récupérer ! Vivement le week-end

    Citation Envoyé par Guulh Voir le message
    Certes Là où je suis pas d'accord, ce'st que ce n'est pas avec ce constructeur là que l'on spécifie une taille max, c'est avec celui-ci.
    Tout à fait, merci de corriger mon erreur
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Les string ne se redimensionnent pas, ils sont immutables. Soyons précis
    Immutable c'est en anglais. Immuable en français. Soyons précis

    Instinctivement j'utiliserais un tableau de caractère. Mais tout dépend de l'utilisation que l'on veut en faire..
    J’ai des questions à toutes vos réponses!

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci à Guulh
    Claude: quel est ton besoin ? Veux tu faire de la validation, pour t'assurer que tel propriété de tel object est une string d'une taille donnée ? Ou veux tu exporter ces string quelque part, dans un fichier ? Ou autre chose ?
    Ce que je veux, c'est réaliser une structure pour me permettre de lire un fichier avec des enregistrements de longueur fixe que j'ai réalisé en VB.Net.
    Dans cette structure, j'ai besoin de déclarer des strings avec une longueur définie pour que ma structure aie la longueur d'un enregistrement.
    Si je peux utiliser <VBFixedString(25)> par exemple dans C#, ça m'ira très bien.
    Par contre, j'ai un autre problème pour ouvrir (en C#), ce type de fichier avec des enregistrements de longueur fixe en mode Random.
    Je n'ai trouvé aucune explication ni exemple dans l'aide.

    Si tu peux m'aider j'en serai ravi

    Claude Azoulai

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    J'ai trouvé une méthode pour lire mon fichier

    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
     
            private void InitialiseDonnées()
            {
                Chemin = Application.StartupPath +"\\" ;
                nomFic = Chemin+"Amis.dat";
                StreamReader sr = new StreamReader(nomFic);
     
                {
                string s = "";
                while ((s = sr.ReadLine()) != null) 
                    {
                        Longueur = s.Length;
                    }
                }
            }
    Je m'aperçois que je lis tout mon fichier d'un coup (2320 octets).
    Bien sur, je pourrai le découper en plusieurs morceaus de la longueur d'un enregistrement et ensuite les découper pour retrouver tous mes champs.

    N'y a-t-il pas une méthode pour lire les 80 premiers caractères (correspondant à un enregistrement) puis ensuite lire les 80 suivants et ainsi-de-suite.

    Corolairement écrire dans un autre fichier les 80 premiers caractères et ensuite rajouter les 80 suivants et ainsi-de-suite.

    Dans ce cas là, je n'ai plus besoins de prévoir une structure.

    Merci de votre réponse

    Claude Azoulai

  10. #10
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Tu peux utiliser la méthode StreamReader.Read(char[], Int32, Int32).
    Voici l'exemple fournit par msdn:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                using (StreamReader sr = new StreamReader(path)) 
                {
                    //This is an arbitrary size for this example.
                    char[] c = null;
     
                    while (sr.Peek() >= 0) 
                    {
                        c = new char[5];
                        sr.Read(c, 0, c.Length);
                        //The output will look odd, because
                        //only five characters are read at a time.
                        Console.WriteLine(c);
                    }
                }
    Comme tu peux le voir, les données sont récupérer dans un tableau de caractère.
    J’ai des questions à toutes vos réponses!

Discussions similaires

  1. Calcul des combinaisons de produits par paquet de longueur fixe
    Par ELIStheWORLD dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 04/03/2015, 09h53
  2. écrire des chaînes de longueur indéfinie
    Par denispir dans le forum Débuter
    Réponses: 18
    Dernier message: 15/04/2012, 13h19
  3. Déclarer un tableau de longueur fixe
    Par horneth dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 18/08/2006, 22h26
  4. Passage des chaînes de caractères à une application CGI
    Par Thom@s dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/12/2004, 00h13
  5. Comment enregistrer un stream de longueur fixe ?
    Par Alcarbone dans le forum MFC
    Réponses: 5
    Dernier message: 13/04/2003, 20h14

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