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 :

Explication méthode Get next line


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2021
    Messages : 2
    Par défaut Explication méthode Get next line
    Bonjour , j'aurais besoin d'aide pour comprendre un code et ses fonctions
    Voici la version du get next line que j'aimerais comprendre

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include "get_next_line.h"
     
    char	*ft_get_line(char *save)
    {
    	int		i;
    	char	*s;
     
    	i = 0;
    	if (!save[i])
    		return (NULL);
    	while (save[i] && save[i] != '\n')
    		i++;
    	s = (char *)malloc(sizeof(char) * (i + 2));
    	if (!s)
    		return (NULL);
    	i = 0;
    	while (save[i] && save[i] != '\n')
    	{
    		s[i] = save[i];
    		i++;
    	}
    	if (save[i] == '\n')
    	{
    		s[i] = save[i];
    		i++;
    	}
    	s[i] = '\0';
    	return (s);
    }
     
    char	*ft_save(char *save)
    {
    	int		i;
    	int		c;
    	char	*s;
     
    	i = 0;
    	while (save[i] && save[i] != '\n')
    		i++;
    	if (!save[i])
    	{
    		free(save);
    		return (NULL);
    	}
    	s = (char *)malloc(sizeof(char) * (ft_strlen(save) - i + 1));
    	if (!s)
    		return (NULL);
    	i++;
    	c = 0;
    	while (save[i])
    		s[c++] = save[i++];
    	s[c] = '\0';
    	free(save);
    	return (s);
    }
     
    char	*ft_read_and_save(int fd, char *save)
    {
    	char	*buff;
    	int		read_bytes;
     
    	buff = malloc((BUFFER_SIZE + 1) * sizeof(char));
    	if (!buff)
    		return (NULL);
    	read_bytes = 1;
    	while (!ft_strchr(save, '\n') && read_bytes != 0)
    	{
    		read_bytes = read(fd, buff, BUFFER_SIZE);
    		if (read_bytes == -1)
    		{
    			free(buff);
    			return (NULL);
    		}
    		buff[read_bytes] = '\0';
    		save = ft_strjoin(save, buff);
    	}
    	free(buff);
    	return (save);
    }
     
    char	*get_next_line(int fd)
    {
    	char		*line;
    	static char	*save;
     
    	if (fd < 0 || BUFFER_SIZE <= 0)
    		return (0);
    	save = ft_read_and_save(fd, save);
    	if (!save)
    		return (NULL);
    	line = ft_get_line(save);
    	save = ft_save(save);
    	return (line);
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 793
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par El_padre Voir le message
    Bonjour , j'aurais besoin d'aide pour comprendre un code et ses fonctions
    Il est d'usage de copier le code dans le forum plutôt que de demander aux bénévoles d'aller en plus télécharger un fichier => http://club.developpez.com/regles/#LIII-E

    Citation Envoyé par El_padre Voir le message
    Voici la version du get next line que j'aimerais comprendre
    A vue de nez ça lit une ligne de taille à priori infinie dans un fichier et ça retourne la ligne puis se tient prêt à lire la ligne suivante. Le fait d'utiliser un pointeur statique static char *save rend la fonction non réentrante (elle ne peut pas être utilisée par exemple pour lire 2 fichiers en parallèle) ce qui est maintenant très déprécié. De même le buffer char *buf qui est alloué en début de fonction ft_read_and_save() puis libéré en fin de fonction reste assez moyen (autant utiliser alors un tableau de char qui ne nécessite pas d'allocation) mais peut-être c'est voulu à cause d'une possible "grosse" taille qui ne rentrerait alors pas dans la pile.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2021
    Messages : 2
    Par défaut
    Salut,
    Désolé je suis nouveau , c'est la première fois que je poste quelque chose sur le forum , mais cela a été modifié !

    La fonction ft_read_and_save reste encore assez flou , pourrais tu si tu en as le temp de me l'expliquer un peu plus dans le détails stp
    Je ne comprend pas non plus ce que c'est que le BUFFER ..

    et oui nous ne pouvons pas faire plus de 25 lignes par fonction

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 793
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par El_padre Voir le message
    La fonction ft_read_and_save reste encore assez flou , pourrais tu si tu en as le temp de me l'expliquer un peu plus dans le détails stp
    Dans le détail non (trop de commentaires probablement). Mais d'après ce que j'en lis, elle lit "n" caractères dans le fichier et si dans ces "n" caractères il n'y a pas de '\n' (caractère de fin de ligne) alors elle concatène ces "n" caractères aux caractères déjà lus en rajoutant de la mémoire.
    Ainsi au final quelle que soit la taille de la ligne dans le fichier, elle se retrouve ensuite stockée en ram. Essaye de chercher des explications sur la fonction getline() sur le net car ce code reproduit son fonctionnement.

    Citation Envoyé par El_padre Voir le message
    Je ne comprend pas non plus ce que c'est que le BUFFER ..
    Tu veux sans doute parler de BUFFER_SIZE... Il n'est pas décrit dans ton code mais par habitude je dirais que c'est une macro définissant la taille d'une zone de stockage.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SIZE_NOM			(10)
    char nom[SIZE_NOM + 1]
    Ensuite tout le code travaille avec SIZE_NOM exemple for (i=0; i < SIZE_NOM; i++). Si demain la taille du nom passe de 10 à 20, tu ne le changes qu'une fois dans le code et tu recompiles => tout le code s'y adapte.

    Citation Envoyé par El_padre Voir le message
    et oui nous ne pouvons pas faire plus de 25 lignes par fonction
    Ca vient de ton prof ? Ca c'est bien nul !!! Encore un prof intégriste au regard de berserk fou qui amalgame "conseils" et "commandements divins". Oui c'est vrai qu'une fonction qui ne fait qu'une chose c'est mieux qu'une fonction qui en fait 500 car plus une fonction est atomique plus on peut la réutiliser dans différents contextes. Et de fait une fonction qui ne fait qu'une chose est généralement assez courte. Mais bon si elle fait 25 ou 30 lignes c'est pas un vrai souci. Vaut mieux une fonction de 40 lignes bien aérées, avec des commentaires bien détaillés qu'une fonction compressée à 25 lignes étriquées avec 4 instructions par lignes. Généralement ce genre de prof raté n'a rien compris ni au C en lui-même ni à la façon de l'enseigner...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ca vient de ton prof ? Ca c'est bien nul !!! Encore un prof intégriste ...
    Attention, ça semble être du code de la piscine, cette obligation est une des rares qui a quand même plutôt du sens pour la raison que tu indiques.
    Mais regarde le code, les variables doivent être définies en début de fonction et ne doivent pas être initialisées à cet instant. Ça c'est vraiment en contradiction avec un peu de bon sens. Et c'est une des règles loufoques qui leur sont imposées!

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 793
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    cette obligation est une des rares qui a quand même plutôt du sens pour la raison que tu indiques.
    Dans ce cas on dit "vous veillerez à écrire de petites fonctions simples" ou une phrase analogue. On peut même donner les 25 lignes comme une base de travail, avec une expression généraliste comme par exemple "ce genre de fonction ne devrait généralement pas faire plus de 25 lignes" avec un conditionnel bien explicite. Le PO a bien dit "nous ne pouvons pas" et ça, ce n'est pas du conditionnel

    Citation Envoyé par dalfab Voir le message
    Mais regarde le code, les variables doivent être définies en début de fonction et ne doivent pas être initialisées à cet instant.
    Ah oui je n'avais pas fait attention à ces variables mises en début de fonction. Probablement parce que (même si je ne le fais plus) je l'ai eu fait à une époque et donc que ça ne m'a pas choqué.
    Quant à l'initialisation à la définition là perso je n'en suis partisan Je n'ai rien contre bien entendu mais ce n'est pas mon habitude
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Get Next Line - Problème de compréhension
    Par PrettyLittleLiars dans le forum C
    Réponses: 7
    Dernier message: 07/12/2017, 22h57
  2. reconnaissance de saut de lignes et get line
    Par membreComplexe12 dans le forum C++
    Réponses: 6
    Dernier message: 15/02/2011, 18h05
  3. Tkinter.Text get last line
    Par ____22 dans le forum Tkinter
    Réponses: 0
    Dernier message: 30/08/2010, 12h43
  4. SQLGrammarException: could not get next sequence value
    Par mouss4rs dans le forum Hibernate
    Réponses: 7
    Dernier message: 10/04/2009, 21h43

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