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 :

fread sur une chaine de caractere ?


Sujet :

C

  1. #1
    Battosaiii
    Invité(e)
    Par défaut fread sur une chaine de caractere ?
    j'ai un du texte
    #define BLOCK_LEN 16
    J'aimerais faire l'equivalent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread((char*)dbuf + BLOCK_LEN, 1, BLOCK_LEN, fin);
    au lieu de faire cette procedure sur un fichier fin j'aimerais le faire sur un string de longueur 16 bytes.
    existe il une fonctyion pour faire la meme chose ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Bonjour,
    Je ne comprends pas trop ta question.
    S'agit il de lire une string?
    Peux tu donner un exemple?

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: fread sur une chaine de caractere ?
    Citation Envoyé par Battosaiii
    existe il une fonctyion pour faire la meme chose ?
    strcpy()

  4. #4
    Battosaiii
    Invité(e)
    Par défaut
    ok,
    J'aimerais faire la meme operation qu'avec cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread((char*)dbuf + BLOCK_LEN, 1, BLOCK_LEN, fin);
    au lieu d'avoir en entree un fichier File *fin , j'aimerais mettre une chaine de caractere de type *char.
    desole pour le premiere message j'ai pas relu.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Il existe la fonction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * strncpy(char * restrict dst, const char * restrict src, size_t len);
    description du man:
    The strncpy() function copies not more than len characters into dst, appending `\0' characters if src is less than len characters long, and not terminating dst if src is len or more characters long.

  6. #6
    Battosaiii
    Invité(e)
    Par défaut
    merci de ton initiative frenchi et DaZumba j'apprecie. J'ai utilise cette fonction et j'en suis arrive a la conclusion que l'equivalent serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //if(fwrite((char*)dbuf, 1, BLOCK_LEN, fout) != BLOCK_LEN)
              //  return WRITE_ERROR;
    	strncpy(textout,dbuf,BLOCK_LEN);
    l'equivalent de la 1ere fonction est la 2eme ... Est ce que je me trompe ?
    Pourtant en pensant recopier les 16 premier byte de dbuf dans textout j'obtiens un segmentation fault...

    Fwrite realise de mon point de vue : recopiage dans le tableau de caractere dbuf de l'indice 1 a BLOCK_LEN. On recopie ceci dans le fichier fin.
    Est ce que mes suppositions sont justes ou fausses ?

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Battosaiii
    Pourtant en pensant recopier les 16 premier byte de dbuf dans textout j'obtiens un segmentation fault...
    Montres comment tu déclares ton tableau textout...

    Fwrite realise de mon point de vue : recopiage dans le tableau de caractere dbuf de l'indice 1 a BLOCK_LEN.
    Non, d'indice 0 à 1 * BLOCK_LEN - 1 (le premier 1 vient du 2ème paramètre que tu passes à fwrite...

    Jc

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Battosaiii
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(textout,dbuf,BLOCK_LEN);
    Pourtant en pensant recopier les 16 premier byte de dbuf dans textout j'obtiens un segmentation fault...
    Comment est défini textout ? Il faut poster du code complet et compilable, sinon, on ne peut rien dire de précis...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Battosaiii
    Invité(e)
    Par défaut
    Voici le code de la fonction entiere, il y a des problemes de segmentation fault quand je laisse trainer les strncpy(sauf le premier).


    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
    void encfile(char *text, char *textout, aes_encrypt_ctx ctx[1])
    {   unsigned char dbuf[3 * BLOCK_LEN],b;
        unsigned long i, len, wlen = BLOCK_LEN;
    	char textByte[32];
     
        fillrand(dbuf, BLOCK_LEN);
    	printf("dbuf1=%s\n",dbuf);
        // read the first file block
        len =16; //(unsigned long) fread((char*)dbuf + BLOCK_LEN, 1, BLOCK_LEN, fin);
    	//printf("len=%d and text= %s\n",len,text);
    	 ConvertHexaToByte(text,textByte);
     
    	 //printf("len=%d and textByte= %s\n",len,textByte);
    	//((char*)dbuf + BLOCK_LEN)=text;
    	printf("encfile debut\n");
    	strncpy((char*)dbuf + BLOCK_LEN,textByte,16);
    	printf("dbuf2=%s\n",dbuf);
    	unsigned char *b1 = dbuf, *b2 = b1 + BLOCK_LEN, *b3 = b2 + BLOCK_LEN, *bt;
    		printf("len >=16 len= %d\n",len);
            // write the IV
            //if(fwrite((char*)dbuf, 1, BLOCK_LEN, fout) != BLOCK_LEN)
              //  return WRITE_ERROR;
    	strncpy(textout,dbuf,BLOCK_LEN);
    	printf("dbuf3=%s\n",dbuf);
            for( ; ; )
            {
                // read the next block to see if ciphertext stealing is needed
                //len = (unsigned long)fread((char*)b3, 1, BLOCK_LEN, fin);
     
                // do CBC chaining prior to encryption for current block (in b2)
                for(i = 0; i < BLOCK_LEN; ++i)
                    b1[i] ^= b2[i];
     
                // encrypt the block (now in b1)
                aes_encrypt(b1, b1, ctx);
     
                if(len != 0 && len != BLOCK_LEN)    // use ciphertext stealing
                {
                    // set the length of the last block
                    wlen = len;
     
                    // xor ciphertext into last block
                    for(i = 0; i < len; ++i)
                        b3[i] ^= b1[i];
     
                    // move 'stolen' ciphertext into last block
                    for(i = len; i < BLOCK_LEN; ++i)
                        b3[i] = b1[i];
     
                    // encrypt this block
                    aes_encrypt(b3, b3, ctx);
     
                    // and write it as the second to last encrypted block
                    //if(fwrite((char*)b3, 1, BLOCK_LEN, fout) != BLOCK_LEN)
                     //   return WRITE_ERROR;	
    				//strncpy(textout,(char*)b3,BLOCK_LEN);
                }
     
                // write the encrypted block
                //if(fwrite((char*)b1, 1, wlen, fout) != wlen)
                  //  return WRITE_ERROR;
    			strncpy(textout,(char*)b1,wlen);
    			printf("textout= %c\n",&textout);
                if(len != BLOCK_LEN)
                    return;
     
                // advance the buffer pointers
                bt = b3, b3 = b2, b2 = b1, b1 = bt;
            }
     
    }
    Le probleme de la boucle n'est pas encore regle car je me perds dans ce programme.Dans lequel je tente de modifier les variables copier dans des fichier en variables copier dans d'autres variables. Voila pour la philo du code...

  10. #10
    Battosaiii
    Invité(e)
    Par défaut
    j'ai declare char *textout si il y a trop d'infos ...

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Je ne suis pas sur, mais si tu as pas malloc textout de 16bits, je ne sais pas si strncpy le fait.
    Ton probleme vient peut etre de la.

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ce que nous voulons savoir c'est comment tu alloues dynamiquement text_out... Poste un code complet compilable qui pose problème en enlevant les parties inutiles...

    Jc

  13. #13
    Battosaiii
    Invité(e)
    Par défaut
    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
     
    int main(int argc, char *argv[])
    {   
    	char *DT1,*S1,*K;
    	S1="0";	
    	encrypte(DT1,S1,K);//DT1=0...1(hex) K=(hex) or binary
     
    }
     
    void encrypte(char *text,char *cipher,char *K)
    	{
     int i, by = 0, key_len, err = 0;
    	char *cp,ch,Key[32];
    	cp=K;
    //code inutile
            encfile(text,cipher, ctx)
    }
     
    //Enfin la derniere partie de code :
    void encfile(char *text, char *textout, aes_encrypt_ctx ctx[1])
    {   unsigned char dbuf[3 * BLOCK_LEN],b;
        unsigned long i, len, wlen = BLOCK_LEN;
    	char textByte[32];
        fillrand(dbuf, BLOCK_LEN);
        len =16;
     
    	 ConvertHexaToByte(text,textByte);
    		strncpy((char*)dbuf + BLOCK_LEN,textByte,16);
     
    	unsigned char *b1 = dbuf, *b2 = b1 + BLOCK_LEN, *b3 = b2 + BLOCK_LEN, *bt;
    		strncpy(textout,dbuf,BLOCK_LEN);
    }
    Voila le cheminement de textout...

  14. #14
    Battosaiii
    Invité(e)
    Par défaut
    Autre question vite fait meme si la plus importante est la precedente :
    Comment determine on la taille d'un caractere ? Sizeof c'est pas ca alors ....
    quelle est la taille de cette chaine ?strncpy((char*)b3,textByte,BLOCK_LEN);

  15. #15
    Battosaiii
    Invité(e)
    Par défaut
    Grace a vos differentes remarques je me suis appercu que le segmentation fault etait du au fait que textout="0";
    Desormais si quelau'un pouvait m'indiquer comment obtenir la taille d'une chaine de caractere ... J'ai beau parcourir l'help c'est difficile a trouver quelque chose ...

  16. #16
    Battosaiii
    Invité(e)
    Par défaut
    Pour etre plus precis j'aimerais retourner le nombre d'elements que strncpy a reussi a copier dans strncpy(textout,dbuf,BLOCK_LEN);. Cad j'aimerais retourner le meme nombre que len dans :
    len=(unsigned long)fread((char*)b3, 1, BLOCK_LEN, fin);
    merci

  17. #17
    Battosaiii
    Invité(e)
    Par défaut
    Est ce que quelau'un peut me confirmer que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    len=(unsigned long)fread((char*)b3, 1, BLOCK_LEN, fin);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    len=strlen(strncpy((char*)b3,textByte,BLOCK_LEN));
    font exactement la meme chose ?

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Battosaiii
    Voila le cheminement de textout...
    Donc textout est l'adresse du premier élément de la chaine "0".
    • une chaine n'est pas modifiable.
    • même si elle l'était, elle ne serait pas assez grande.

    Pour résoudre ton problème, dans main(), tu dois définir un tableau de char suffisament grand, et passer l'adresse de son premier élément et la taille du tableau aux fonctions de façon à ce que celle qui écrit dans le tableau ait les moyens de vérifier qu'elle ne déborde pas.

    Attention, en cas de saturation, strncpy() ne met pas le 0 final. Je recommande plutôt strncat(). Bien lire la doc...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. expression réguliere sur une chaine de caractere
    Par delilou dans le forum Général Java
    Réponses: 6
    Dernier message: 22/04/2011, 17h09
  2. Effectuer un "trim" sur une chaine de caractere
    Par Jayceblaster dans le forum Débuter
    Réponses: 9
    Dernier message: 31/07/2008, 09h42
  3. Traitement sur une chaine de caractere
    Par emma3345 dans le forum Langage
    Réponses: 6
    Dernier message: 02/12/2007, 23h21
  4. fonction replaceFirst sur une chaine de caractere
    Par marcxa44 dans le forum Langage
    Réponses: 1
    Dernier message: 08/10/2007, 13h22
  5. Conditions sur une chaine de caractères
    Par xenos dans le forum Delphi
    Réponses: 2
    Dernier message: 21/05/2006, 22h56

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