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 :

Le retour chariot


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut Le retour chariot
    Bonsoir,

    J'essaie de réaliser un code qui qui enregistre tous l'ensemble d'un fichier dans une chaine pour ensuite retourner le nombre de caractère mais lorsque j'enregistre mon fichier dans ma chaine, ça s'arrête au première espace ou au premier \n . Je ne sais pas comment manipuler la chaine pour lui dire != "/0" et qu'elle continue même si il y a "/n"

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
    int i;
    int lecture;
    FILE *fichier;
    char nm_fic[10];
    char (*buffer)[500];
    size_t taille=0;
     
    scanf("%s",nm_fic);
    fichier=fopen(nm_fic,"rb");
     
     
    if (fichier!= NULL)
    {
     
    	printf("OUverture fichier.\n");
    	buffer=malloc(500*sizeof(char));
    	if (buffer != NULL)
    	{
    		fscanf(fichier,"%s",buffer);
    		for (i=0; i<strlen(buffer); i++)
    		{
    			if (buffer[i])
    			++taille;
    		}
    		printf("Taille %d\n",taille);
    	}
     
    	else
    	{
    		printf("Echec allocation memoire\n");
    	}
    }
    free(buffer);
    fclose(fichier);		
    system("pause");
    return 0;
    }
     
    Merci de votre attention ;) , bonne soirée !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par boubz013 Voir le message
    J'essaie de réaliser un code qui qui enregistre tous l'ensemble d'un fichier dans une chaine pour ensuite retourner le nombre de caractère
    Tu mélanges plusieurs choses. Si c'est connaître la taille totale de ton fichier qui t'intéresse, utilises stat() ou GetFileSize() sous Windows.

    mais lorsque j'enregistre mon fichier dans ma chaine, ça s'arrête au première espace ou au premier \n . Je ne sais pas comment manipuler la chaine pour lui dire != "/0" et qu'elle continue même si il y a "/n"
    Si ce sont tous les caractères différents de zéro que tu souhaites compter, tu peux faire un fread() en précisant la taille de ton buffer. Comme on ne connaît pas à l'avance la taille de ton fichier, il se peut qu'il soit plus petit, égal ou plus grand que ce buffer.

    fread() lit donc les octets indépendamment de leur contenu. C'est donc ce que tu cherches à faire. Cette fonction te renvoie le nombre d'éléments qu'elle a réussi à lire. Il faut donc lui demander de lire des membres d'un seul octet de long (paramètre size), ou alors « sizeof(char) » si tu veux faire les choses dans les règles de l'art. La valeur retournée sera donc le nombre de caractères lus.

    Tu mets cette valeur dans une variable « j » et tu fais une boucle for() qui observe « i < j » et non plus « i < strlen(buffer) ».

    Ensuite, comme ton fichier est potentiellement plus grand que ton buffer, il faudra faire plusieurs passes si le nombre de caractères lus est égal à sa taille. Donc, tu commences par remplacer :


    par


    et tu inclus toute ta condition if-else à l'intérieur d'un :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    do {} while (sizeof(buffer)==j);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut
    Bonjour Obsidian,

    J'ai etudié le code , je le trouve assez complexe pour moi mais j'ai essayé de le récrire tel que tu me la expliqué plus haut, c'est un peu du n'importe quoi mais je veux comprendre pourquoi je fais n'importe quoi alors j'ai commenter chacune de mes lignes et si ça ne te derange pas de me corriger ça serait super !!

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
     
    char buffer[500]; // buffer assez grand pour 500
    int lecture;
    int j;
    int i;
    FILE *fichier=NULL;
    char nm_fic[10];
    size_t taille=0;
    char *tab=NULL;  // pour remplir ma chaine buffer dans un tableau
     
    scanf("%s",nm_fic);
    fichier=fopen(nm_fic,"rb");
     
     
    if (fichier!= NULL) // verifier sir le fichier existe
    {
     
    	printf("OUverture fichier.\n");
    	while (!feof(fichier))  // tant qu'on a pas atteint la fin du fichier
    	{
     
              	lecture=fread(buffer,sizeof(char),500,fichier); // On stoke la lecture du fread() dans la variable lecture
     
    		if (lecture != NULL) // On verifie si la lecture a reussie
    		{
    			j=sizeof(char); // On stoke dans j la taille de char (je ne comprends pas trop parcontre)
    			for(i=0;i<j;i++) // on parcours sans doute notre chaine buffer
    			{
    				if (buffer[i]) // On verifie que notre buffer existe si oui
    				{
    					printf("%s\n",buffer); // on affiche le buffer en incrementant la taille
    					++taille;
    				}
     
    				if (buffer[i]>j) // On verifie que la chaine du buffer ne soit pas plus grande que j
    				{
    					printf("Plus de 500 caracteres.\n");
    					break;
    				}
    			}
    		}
     
    		if (taille==0) // ON verifie que la taille ne soit pas pas = à  0
    		{
    			printf("0 caractere.\n");
    		}
     
    		else
    		{
    			tab=malloc(taille*j); // allocation de memoire , multiplie la variable taille incrmenté 
    			if (tab!=NULL)
    			{
    				tab=buffer; // On remplie notre chaine buffer dans notre tableau 
     
    				printf("Taille:%d\n",taille);
    				printf("%s",*tab);
        			}
     
    		}
    	}
     
     
     
    system("pause");
    return 0;
    }
    En te remerciant !!!

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par boubz013 Voir le message
    Bonjour Obsidian,

    J'ai etudié le code , je le trouve assez complexe pour moi mais j'ai essayé de le récrire tel que tu me la expliqué plus haut, c'est un peu du n'importe quoi mais je veux comprendre pourquoi je fais n'importe quoi alors j'ai commenter chacune de mes lignes et si ça ne te derange pas de me corriger ça serait super !!
    Alors, à première vue :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    j=sizeof(char); // On stoke dans j la taille de char (je ne comprends pas trop parcontre)

    Non. Ce que je t'ai dit de faire, c'est de mettre dans « j » la valeur renvoyée par fread(), car celle-ci te donne le nombre de caractères qu'elle a réussi à lire. C'est la valeur que tu as mise dans « lecture » à la place.

    D'ailleurs, à ce sujet :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    if (lecture != NULL) // On verifie si la lecture a reussie

    Ça, c'est faux également, pour les mêmes raisons qu'au dessus : fread() ne renverra jamais « NULL ». Elle pourra éventuellement renvoyer zéro, ce qui se confondra avec la valeur de NULL, mais ce sont des termes qui désignent deux choses différentes.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    if (buffer[i]) // On verifie que notre buffer existe si oui

    Non plus. Quand tu fais cela, tu lis le contenu du caractère se trouvant à la position « i » de buffer (que ce buffer existe ou non, d'ailleurs) et tu l'évalues. Si ce caractère est non-nul, la condition est évaluée comme vraie.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    if (buffer[i]>j) // On verifie que la chaine du buffer ne soit pas plus grande que j

    Toujours pas (désolé). Quand tu fais cela, tu compares la valeur d'un caractère (à la position i) à celle de j. Ce qui ne signifie rien en l'occurence.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			tab=malloc(taille*j); // allocation de memoire , multiplie la variable taille incrmenté
    Ici, il y avait de l'idée. Sauf que j n'est pas censée contenir la taille d'un caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			tab=buffer; // On remplie notre chaine buffer dans notre tableau
    Non ! Quand tu fais ça, tu copies les pointeurs ! L'adresse de buffer est copiée dans tab qui, alors, pointe le même tampon. Et donc, au passage, tu as perdu l'adresse de la zone mémoire allouée par malloc(), qui ne pourra plus être libérée.

    • Pour copier un tampon dans un autre, utilises strcpy() ou memcpy() ;
    • Si tu alloues de la mémoire avec malloc(), il faut penser à la libérer avec free(). Le programme ne le fera pas pour toi. Je ne vois pas cet appel dans ton programme.


    Courage.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut
    Pas de probléme je vais revoir tout ça!!,
    en tout cas je te remercie !

Discussions similaires

  1. retour chariot GetWindowText
    Par johnlehardos dans le forum MFC
    Réponses: 2
    Dernier message: 29/01/2004, 21h20
  2. Retour chariot
    Par raf_gug dans le forum MFC
    Réponses: 9
    Dernier message: 13/01/2004, 17h54
  3. afficher texte avec retour chariot aprèq requète sql
    Par frenchy371 dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 17h33
  4. retour chariot dans un string
    Par bono dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/12/2003, 12h17
  5. Retour chariot dans un TMemo ?
    Par Vincent PETIT dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/08/2002, 18h55

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