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 :

Obtenir le caractère à une position donnée dans un fichier


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut Obtenir le caractère à une position donnée dans un fichier
    Bonjour à tous,

    Je début dans le traitement de fichier en C.
    Je cherche à créer une application capable de m'afficher sur la sortie standard les n dernières lignes d'un fichier passé en paramètre (n étant aussi passé en paramètre).

    J'envisage d'utiliser l'algorithme suivant :
    - Me placer à la fin du fichier.
    - Lire caractere par caractere en remontant vers le début du fichier, et stocker les caractere dans un tampon.
    - Si je rencontre un '\n', j'affiche le contenu de mon tampon.
    ===> je recommence n fois.

    Et se pose un problème pour moi :
    Une fois que je connais la taille en octets, et donc le nombre de caractères de mon fichier, comment obtenir le dernier caractère, puis le précédent... etc.

    Merci en tout cas de votre aide!

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    Bonjour à tous,

    Je début dans le traitement de fichier en C.
    Je cherche à créer une application capable de m'afficher sur la sortie standard les n dernières lignes d'un fichier passé en paramètre (n étant aussi passé en paramètre).

    Et se pose un problème pour moi :
    Une fois que je connais la taille en octets, et donc le nombre de caractères de mon fichier, comment obtenir le dernier caractère, puis le précédent... etc.

    Merci en tout cas de votre aide!
    Salut

    Pour un fichier ouvert avec fopen(), alors tu peux utiliser fseek() qui te positionne dans le fichier
    fseek(fichier, SEEK_SET, x) => te place en position x
    fseek(fichier, SEEK_CUR, x) => te fait avancer de x caractères par rapport à ta position courante
    fseek(fichier, SEEK_END, x) => te place x caractères avant la fin de fichier

    Pour un fichier ouvert avec open() alors faut utiliser lseek() avec les mêmes critères...

    Citation Envoyé par Alba.1337 Voir le message
    J'envisage d'utiliser l'algorithme suivant :
    - Me placer à la fin du fichier.
    - Lire caractere par caractere en remontant vers le début du fichier, et stocker les caractere dans un tampon.
    - Si je rencontre un '\n', j'affiche le contenu de mon tampon.
    ===> je recommence n fois.
    Plus simple: tu parcours ton fichier en comptant les '\n' ce qui te donne le nb de lignes. Tu stockes la position de chaque début de ligne dans un tampon.
    Quand tu connais le nb de lignes tu calcules la ligne "l" sur laquelle il te faut aller pour avoir les "n" dernières lignes puis tu t'y place via fseek() car tu connais sa position (prise dans le tampon) et tu lis jusqu'à la fin...
    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 membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    En effet le 2e algorithme est pas mal... Je place donc dans un tableau, un pointeur sur chaque caractère consécutif à un '\n' et le premier caractère du fichier... Et il me suffit, quand je connais le nombre de lignes, de parcourir l'espace mémoire à partir de la ligne concernée, jusqu'à la fin du fichier?

    Mais pour en revenir à mon algo, quand j'ai placé ma tête de lecture avec fseek, comment lire le caractère sous la tête? read?

    Excusez moi, je débute vraiment en traitement de fichiers...

    Merci!

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    salut !
    dans http://publications.gbdirect.co.uk/c_book/ il y a un chapitre 9 Libraries où tu trouveras une brève description de chaque fonction d'un standard ancien qui permet de faire rapidement le tour de tout ce qu'on peut faire sans difficulté. dans ton cas précis :
    9.11. Formatted I/O
    9.12. Character I/O
    A+

    PS il existe une version pdf de ce manuel (google ...).
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'allais dire : regardons tail... Mais vu la taille du fichier source, ce n'est peut-être pas une bonne idée

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Bah le but de ce tp, est de faire une version simplifiée de tail

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Bon alors j'ai fait quelque chose...
    Ca compile, c'est déjà pas mal, mais doit y avoir une boucle infinie quelque part. De plus, je doute vraiment que ca puisse marcher, ne sachant pas utiliser "read" etc... Si quelqu'un comprends la manière dont je veux procéder, je suis à l'écoute de tout conseil.
    Je rame

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h> 
    #include <fcntl.h>
     
     
     
     
    int main(int argc, char* argv[])
    {
    	int srce, j, i;
    	char tampon[_SC_LINE_MAX];  /*Apparemment SC_LINE_MAX designe le nombre maximum de caracteres par ligne*/
     
     
     
    	if ((srce = open(argv[2], 0, 0777)) < 0)	/* a verifier les parametres de open*/
    	{
    	        perror("open ");
    		exit(EXIT_FAILURE);
    	} else {
     
     
    		lseek(srce, 0, SEEK_END);					  /*place la tête de lecture à la fin*/
     
     
    		for(i=0; i<atoi(argv[1]); i++)
    		{
    			j=0;
    			do{
    				read(srce, tampon, 1);						/*lit un caractere et le stocke dans tampon*/
    				lseek(srce, -1, SEEK_CUR);					/*recule la tete de lecture d'un octet*/
    				j+=1;
    			}while(tampon[i]!='\n');
     
    			j-=1;         /*Pour ne pas afficher le retour chariot en fin de tampon*/
    			while(j>=0)   /*Permet d'afficher la ligne*/
    			{
    			printf("%c", tampon[j]);
    			j-=1;
    			}
    			printf("\n");  /*ajoute un retour chariot après affichage de la ligne*/
    		}
    	}
    	close(srce);
     
    	return 0;
     
     
    }
    Merci!

  8. #8
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Que cherches-tu à faire avec ton tampon ? Si tu lis ton fichier caractère par caractère, tu n'as pas besoin de chaîne de caractère déclarée statiquement. Peut-être cherches-tu à faire quelque chose de pertinent avec, mais dans ton code source je n'en vois pas l'intérêt.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    En effet le 2e algorithme est pas mal... Je place donc dans un tableau, un pointeur sur chaque caractère consécutif à un '\n'
    Tu n'as pas bien réfléchi.
    Les caractères lus du fichier ne sont pas en mémoire. Donc stocker un "pointeur" ne te servira à rien.
    C'est les positions des lignes qu'il te faut stocker...

    Citation Envoyé par Alba.1337 Voir le message
    et le premier caractère du fichier...
    As-tu vraiment besoin de stocker la position de la première ligne du fichier ???
    Citation Envoyé par Alba.1337 Voir le message
    Et il me suffit, quand je connais le nombre de lignes, de parcourir l'espace mémoire à partir de la ligne concernée, jusqu'à la fin du fichier?
    Ben non, ce n'est pas ce que j'ai écrit. Les lignes lues ne sont pas en mémoire...

    Citation Envoyé par Alba.1337 Voir le message
    Mais pour en revenir à mon algo, quand j'ai placé ma tête de lecture avec fseek, comment lire le caractère sous la tête? read?
    read() ne marche que pour les fichiers ouverts avec open(). Pour fopen() alors tu as le choix entre
    fgetc() => 1 caractère
    fgets() => 1 ligne entière
    fread() => 1 bloc de "n" éléments, chaque élément étant de la taille de "x" octets
    fscanf() => 1 entrée formatée

    Citation Envoyé par Alba.1337 Voir le message
    Bon alors j'ai fait quelque chose...
    Ca compile, c'est déjà pas mal, mais doit y avoir une boucle infinie quelque part. De plus, je doute vraiment que ca puisse marcher, ne sachant pas utiliser "read" etc... Si quelqu'un comprends la manière dont je veux procéder, je suis à l'écoute de tout conseil.
    Le problème de open()+read(), c'est qu'il n'y a aucune notion de "ligne" dans ces outils. read() te lit "n" octets
    C'est donc à toi ensuite de chercher les '\n' pour découper ces octets en "lignes" identifiables. Au pire tu peux lire tes octets un à un pour construire ta ligne caractère par caractère mais c'est pas ce qu'il y a de plus fin...

    Si t'es libre de tes choix, je te conseillerais plutôt fopen() + fgets() plus dédiés aux fichiers textes. Car fgets() lit "n" octets mais s'arrête s'il rencontre un '\n' => il te donne donc une ligne complète...
    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]

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Re-bonjour, et merci du temps que vous prenez pour m'aider.

    En fait, ce que je pensais faire moi, c'est lire mon fichier caractere par caractere à partir de la fin, et stocker ces caracteres dans mon tampon. Comme ca a chaque '\n', je peux lire mon tampon en partant de la fin de celui-ci, pour avoir ma chaine dans l'ordre.

    Sve@r, ta technique me parait beaucoup plus naturelle, surtout grace à fgets() qui peut récupérer directement une ligne...
    Mon problème, c'est que je vois bien comment trouver la position d'un '\n' (avec une boucle while et un compteur?), mais une fois que j'ai un tableau avec les positions des débuts de lignes, comment obtenir le caractère à la position donnée? N'y a t'il pas de fonction directe? Suis-je contraint d'utiliser une boucle?

    Et puisque fgets() me donne directement une ligne, ne puis-je pas simplement compter le nombre de ligne de mon fichier, puis re-parcourir mon fichier en n'affichant que les lignes demandés?

    Merci encore.


    PS : j'avais trouvé la variable SC_LINE_MAX pour la longueur maximale d'une ligne, ce qui me permettait d'initialisé mon tampon. Mais y a t-il un nombre maximum de lignes dans un tableau? (je demande ca pour la creation du tableau de positions).

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    En fait, ce que je pensais faire moi, c'est lire mon fichier caractere par caractere à partir de la fin, et stocker ces caracteres dans mon tampon. Comme ca a chaque '\n', je peux lire mon tampon en partant de la fin de celui-ci, pour avoir ma chaine dans l'ordre.
    Oui si tu veux.

    Citation Envoyé par Alba.1337 Voir le message
    Sve@r, ta technique me parait beaucoup plus naturelle, surtout grace à fgets() qui peut récupérer directement une ligne...
    Mon problème, c'est que je vois bien comment trouver la position d'un '\n' (avec une boucle while et un compteur?), mais une fois que j'ai un tableau avec les positions des débuts de lignes, comment obtenir le caractère à la position donnée?
    Ton sujet n'est pas d'avoir le "caractère à la position donnée" mais d'afficher les "n" dernières lignes. Donc si ton fichier a 15 lignes et que tu dois afficher les 4 dernières ben tu vas à la position où débute la ligne 12 et tu affiches tout le reste du fichier...

    Citation Envoyé par Alba.1337 Voir le message
    N'y a t'il pas de fonction directe? Suis-je contraint d'utiliser une boucle?
    fseek() + boucle sur fgets()

    Citation Envoyé par Alba.1337 Voir le message
    Et puisque fgets() me donne directement une ligne, ne puis-je pas simplement compter le nombre de ligne de mon fichier, puis re-parcourir mon fichier en n'affichant que les lignes demandés?
    Oui ça marche aussi....

    Citation Envoyé par Alba.1337 Voir le message
    PS : j'avais trouvé la variable SC_LINE_MAX pour la longueur maximale d'une ligne, ce qui me permettait d'initialisé mon tampon. Mais y a t-il un nombre maximum de lignes dans un tableau? (je demande ca pour la creation du tableau de positions).
    Non. Cela fait partie du domaine des tableaux de taille inconnue qui absorbent des données au fur et à mesure. On peut le résoudre via realloc()
    1) tu places un pointeur à NULL, un indice à 0 et une taille à 0
    2) quand tu veux stocker un élément, tu regardes si l'indice a atteint la taille
    3) si c'est le cas alors tu incrémentes la taille de N et tu realloues ton pointeur de "taille" éléments (quand il est à NULL le realloc est automatiquement converti en malloc)
    4) tu stockes l'élément dans la case "indice" et tu incrémentes l'indice
    Mais c'est peut-être pas encore au programme de ton cours. A mon avis, ta proposition de compter puis de revenir et d'afficher est pas mal. Surtout que comme il faudra compter 2 fois (une fois pour connaitre le nb de lignes et une seconde fois pour se placer sur la ligne qui va bien), tu peux dédier ce travail à une fonction dédiée (à laquelle tu passes une info disant s'il faut tout compter ou compter seulement "n" lignes)...
    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]

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    En effet, je comprends le principe pour le tableau, mais on en a jamais fait encore, je vais donc plutot m'en tenir à la technique avec le nombre de lignes.

    Merci beaucoup de ton aide! Je m'y attelle dès que possible!

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Désolé, c'est encore moi...

    J'ai fait ceci, qui compile :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
     
    /*fonction affichant les 'nbe_lignes' dernieres lignes d'un fichier compose de 'longueur_fichier' lignes*/
     
    int affiche_fin(FILE *srce,char* buff, int nbe_lignes, int longueur_fichier,)
    {
    	int i=0;
     
    	/*On se déplace juqu'à la première ligne à afficher*/
    	while(i<(longueur_fichier-nbe_lignes)){
    		(fgets(buff,  (_SC_LINE_MAX +1), srce);
    		i+=1;
    	}
     
    	/*On affiche jusqu'à la fin*/
    	while((fgets(tampon, (_SC_LINE_MAX +1), src))!= NULL)
    	{
    		printf("%s", tampon);
    	}
     
    	return 0;
    }
     
     
     
     
     
     
     
     
    int main(int argc, char* argv[])
    {
    	int i=0,j;
    	FILE* src;
    	char c;
    	char tampon[_SC_LINE_MAX];
     
    	src = fopen(argv[2], "a");
    	if(src==NULL){
    		perror("fopen error");
    		exit(EXIT_FAILURE);
    	}						/*src contient ici un pointeur vers notre fichier*/
     
     
    	/*On compte le nombre de lignes de notre fichier*/
    	while((fgets(tampon, (_SC_LINE_MAX +1), src))!= NULL)
    	{
    		i+=1;
    	}
     
    	/*On gere le cas ou on demande plus de lignes qu'il n'y en a dans le fichier*/
    	j=atoi(argv[1]);
    	if(j>i)
    	{
    		printf("Attention : le nombre de lignes demandees, est superieur au nombres de lignes du fichier.\n Tout le fichier est donc affiche : \n\n");
    		j=i;
    	}
     
    	affiche_fin(src, tampon, j, i);
     
    	return 0;	
    }
    ... A mon avis, j'utilise mal fgets(), car ma boucle while me permettant de compter mes lignes, n'incrémente jamais mon "i"... Pourtant j'ai beau chercher sur le net, je ne vois pas ce que je fais de mal...

    A votre bon coeur!

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    Désolé, c'est encore moi...

    J'ai fait ceci, qui compile :
    Ca ça m'étonnerait !!!

    Citation Envoyé par Alba.1337 Voir le message
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    
    /*fonction affichant les 'nbe_lignes' dernieres lignes d'un fichier compose de 'longueur_fichier' lignes*/
    
    int affiche_fin(FILE *srce,char* buff, int nbe_lignes, int longueur_fichier,)
    {
    	int i=0;
    	
    	/*On se déplace juqu'à la première ligne à afficher*/
    	while(i<(longueur_fichier-nbe_lignes)){
    		(fgets(buff,  (_SC_LINE_MAX +1), srce);
    		i+=1;
    	}
    	
    	/*On affiche jusqu'à la fin*/
    	while((fgets(tampon, (_SC_LINE_MAX +1), src))!= NULL)
    	{
    		printf("%s", tampon);
    	}
    	
    	return 0;
    }
    Déjà rien que ça fait que ça ne peut pas compiler !!!

    Citation Envoyé par Alba.1337 Voir le message
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    int main(int argc, char* argv[])
    {
    	int i=0,j;
    	FILE* src;
    	char c;
    	char tampon[_SC_LINE_MAX /* +1 Pour le '\0' !!! */];
    	
    	src = fopen(argv[2], "a");
    	if(src==NULL){
    		perror("fopen error");
    		exit(EXIT_FAILURE);
    	}						/*src contient ici un pointeur vers notre fichier*/
    	
    	
    	/*On compte le nombre de lignes de notre fichier*/
    	while((fgets(tampon, (_SC_LINE_MAX +1), src))!= NULL)
    	{
    		printf("i=%d - %s", i, tampon);
    		i+=1;
    	}
    	
    	/*On gere le cas ou on demande plus de lignes qu'il n'y en a dans le fichier*/
    	j=atoi(argv[1]);
    	if(j>i)
    	{
    		printf("Attention : le nombre de lignes demandees, est superieur au nombres de lignes du fichier.\n Tout le fichier est donc affiche : \n\n");
    		j=i;
    	}
    	
    	affiche_fin(src, tampon, j, i);
    	
    	return 0;	
    }

    ... A mon avis, j'utilise mal fgets(), car ma boucle while me permettant de compter mes lignes, n'incrémente jamais mon "i"... Pourtant j'ai beau chercher sur le net, je ne vois pas ce que je fais de mal...
    Au lieu de chercher sur le net, tu aurais dû chercher dans ta tête, c'est quand même ton plus grand atout !!! Déjà ouvrir en mode "append" c'est pas ce qu'il y a de mieux. Mais pour le gros bug rajoute le printf() que j'ai mis en bleu et regarde ce qui se passe (surtout pour i). Puis rajoute le +1 que j'ai mis en bleu et là tu verras la différence !!! Hé oui, ton fgets() dans une zone pas assez large écrase la variable "i" (oui, je sais, c'est vraiment un manque de bol que ça tombe pile sur "i" mais quand on oublie qu'une chaine a un '\0' ben on le paye et vaut mieux plus tôt que plus tard).

    Accessoirement tu n'as rien compris à la fonction que je t'ai proposée. Cette fonction avait juste pour charge de compter les lignes (opération qui est faite 2 fois donc tu aurais pu écrire l'algo juste une fois dans la fonction que tu appelles 2 fois). Toi tu as fait l'inverse: une fonction qui se déplace sur la bonne ligne puis qui affiche la fin. Total tu écris 2 fois l'algo de comptage et tu n'appelles la fonction qu'une seule fois

    Enfin dernier détail: je ne sais pas où tu es allé pêcher cette macro "_SC_LINE_MAX" mais elle ne vaut rien (n'est même pas assez large pour stocker une ligne de 80 car.). Et peut-être qu'un fseek() serait utile ici où là...
    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]

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Oups! Je m'excuse, en fait j'ai écrit le fichier sous windows, et je l'ai compilé/modifié sous Linux... Et quand j'ai posté, j'ai bêtement repris celui qui était sur mon bureau windows... Donc ce fichier n'était pas corrigé.

    En effet, déjà en ouvrant le fichier en "r" c'est mieux... ><

    J'ai en effet un problème avec _SC_LINE_MAX, elle n'est clairement pas assez grande, mais j'avais lu que c'était une macro POSIX définissant la longueur maximale d'une ligne dans un fichier... Il n'y a donc pas de longueur limite pour une ligne? Je suis contraint d'en mettre une arbitraire, qui donc ne satisfera pas tous les cas?

    Pour fseek, j'avais mal compris encore une fois. Je dois l'utiliser pour revenir au début une fois mon fichier parcouru donc?... Désolé, je rame, mais je m'y remets de suite!

    Merci beaucoup.

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Du coup, j'obtiens ceci, qui est un premier jet qui a le mérite de marcher
    me reste seulement 2 problêmes à résoudre... Celui de la longueur max de mes lignes, ici fixée à 300... Et de revoir ma fonction, parce que pour le coup, c'est que j'suis un peu con... ><

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
     
    /*fonction affichant les 'nbe_lignes' dernieres lignes d'un fichier compose de 'longueur_fichier' lignes*/
     
    int affiche_fin(FILE *srce,char* buff, int nbe_lignes, int longueur_fichier)
    {
    	int i=0;
     
    	rewind(srce);
     
    	/*On se déplace juqu'à la première ligne à afficher*/
    	do{
    		fgets(buff,  (300 +1), srce);
    		i+=1;
    	}while(i<(longueur_fichier-nbe_lignes));
     
    	/*On affiche jusqu'à la fin*/
    	while((fgets(buff, (300 +1), srce))!= NULL)
    	{
    		printf("%s", buff);
    	}
     
    	return 0;
    }
     
     
     
     
     
     
     
     
    int main(int argc, char* argv[])
    {
    	int i=0,j;
    	FILE* src;
    	char tampon[300];
     
    	src = fopen(argv[2], "r");
    	if(src==NULL){
    		perror("fopen error");
    		exit(EXIT_FAILURE);
    	}						/*src contient ici un pointeur vers notre fichier*/
     
     
    	/*On compte le nombre de lignes de notre fichier*/
    	while((fgets(tampon, (300 +1), src))!= NULL)
    	{
    		/*printf("i=%d - %s\n",i, tampon);*/
    		i+=1;
    	}
     
    	/*On gere le cas ou on demande plus de lignes qu'il n'y en a dans le fichier*/
    	j=atoi(argv[1]);
    	if(j>i)
    	{
    		printf("Attention : le nombre de lignes demandees, est superieur au nombres de lignes du fichier.\n Tout le fichier est donc affiche : \n\n");
    		j=i;
    	}
     
    	affiche_fin(src, tampon, j, i);
    	fclose(src);	
     
    	return 0;	
    }

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    Du coup, j'obtiens ceci, qui est un premier jet qui a le mérite de marcher
    me reste seulement 2 problêmes à résoudre... Celui de la longueur max de mes lignes, ici fixée à 300... Et de revoir ma fonction, parce que pour le coup, c'est que j'suis un peu con... ><

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    	char tampon[300 /* TU OUBLIES ENCORE LE +1 !! */];
    ...
    Ok, ça marche et tu as réussi (même s'il y a encore un bug rémanent)
    Donc plutôt que de t'expliquer comment faire pour optimiser, autant te filer ma version. Essaye de l'examiner...

    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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    #define SIZE 1000
     
    int cpt(FILE *fp, int need)
    {
    	int nb;
    	char tampon[SIZE+1];
     
    	// On compte les lignes
    	// On s'arrête à "need" si need différent de -1 sinon on va jusqu'à la fin
    	fseek(fp, 0, SEEK_SET);
    	for (nb=0; nb != need && fgets(tampon, SIZE +1, fp); nb++);
     
    	// On renvoie le nb de lignes
    	return nb;
    }
     
    int main(int argc, char* argv[])
    {
    	FILE* fp;
    	int need;
    	int nbLig;
    	char tampon[SIZE+1];
     
    	fp = fopen(argv[2], "r");
    	if(fp==NULL){
    		perror("fopen error");
    		exit(EXIT_FAILURE);
    	}
     
    	need=atoi(argv[1]);
     
    	// On compte le nombre de lignes de notre fichier
    	nbLig=cpt(fp, -1);
     
    	// On se décale 
    	cpt(fp, need < nbLig ?nbLig - need :0);
     
    	// On affiche la fin
    	while((fgets(tampon, SIZE +1, fp))!= NULL)
    		fputs(tampon, stdout);
     
    	fclose(fp);
    	return 0;	
    }

    En ce qui concerne la taille d'une ligne, tu as raison. Prendre une taille "arbitraire" n'est pas infaillible. Généralement on "peut admettre" que les lignes d'un fichier texte ne dépasseront pas une certaine taille qu'on fixe de façon arbitraire (et avec une macro la modif est facile si besoin). C'est un peu risqué mais on évalue le risque potentiel par rapport à la criticité du truc. C'est sûr qu'on ne doit pas réagir de la même façon si c'est pour faire une commande bateau style tail ou si c'est pour un calculateur de pilote automatique.

    Si vraiment tu veux faire les choses "100% sure" alors tu as la fonction getline() qui lit des lignes de taille potentiellement infinies. Cette fonction alloue la mémoire au fur et à mesure que le besoin s'en fait sentir. Charge à toi de la libérer à l'issue.
    Cette fonction est récente donc n'est pas forcément distribuée de partout. Mais rien ne t'empêche de la (re)créer toi-même.

    Et pour _SC_LINE_MAX tu n'as rien compris. Ce n'est pas la taille maximale d'une ligne, c'est la valeur qu'on passe à la fonction sysconf() pour que sysconf() nous renvoie ladite taille !!!
    http://www.linux-kheops.com/doc/man/...sysconf.3.html
    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]

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    J'obtiens quelque chose qui ressemble aussi du coup :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #define SIZE 1000
     
     
     
    /*fonction placant la tete de lecture à la n-ième ligne les lignes d'un fichier, n etant un parametre entier
      @Return la position de la ligne ou se situe la tete
      @Param un pointeur vers le fichier
      @Param le nombre de ligne à compter, -1 pour compter le nombre de lignes dans le fichier entier*/
    int compteur_ligne(FILE *srce, int lignes)
    {
    	int i=0,j;
    	char tampon[SIZE+1];
     
    	rewind(srce);
     
     
    	if(lignes==-1)
    	{
    		/*On compte le nombre de lignes de notre fichier*/
    		while((fgets(tampon, (SIZE +1), srce))!= NULL)
    		{
    			i+=1;
    		}
    		return i;
    	}else{
    		for(j=0; j< lignes; j++)
    		{
    			fgets(tampon, (SIZE +1), srce);
    			i+=1;
    		}
    		return i;
    	}
     
    }
     
     
     
     
     
    int main(int argc, char* argv[])
    {
    	int i=0,j;
    	FILE* src;
    	char tampon[SIZE +1];
     
    	src = fopen(argv[2], "r");
    	if(src==NULL){
    		perror("fopen error");
    		exit(EXIT_FAILURE);
    	}						/*src contient ici un pointeur vers notre fichier*/
     
     
    	i=compteur_ligne(src, -1); /*i contient le nombre de lignes du fichier*/
     
    	/*On gere le cas ou on demande plus de lignes qu'il n'y en a dans le fichier*/
    	j=atoi(argv[1]);
    	if(j>i)
    	{
    		printf("Attention : le nombre de lignes demandees, est superieur au nombres de lignes du fichier.\n Tout le fichier est donc affiche : \n\n");
    		j=i;
    	}
     
    	compteur_ligne(src, (i-j));
     
    	while((fgets(tampon, (SIZE +1), src))!= NULL)
    	{
    		printf("%s", tampon);
    	}
     
    	return 0;	
    }
    Merci beaucoup de votre aide! Ca a été laborieux pour moi!

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    J'obtiens quelque chose qui ressemble aussi du coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    	while((fgets(tampon, (SIZE +1), src))!= NULL)...
    Attention à toutes ces parenthèses, cela nuit à la lisibilité.
    Un élément compris entre deux virgules est unique. Donc inutile de le parenthéser en plus !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    	while((fgets(tampon, SIZE +1, src))!= NULL)...
    Et pareil partout...

    Citation Envoyé par Alba.1337 Voir le message
    Merci beaucoup de votre aide!
    On est là pour ça. Ta réussite nous élève tous et profite à toute la société.

    Citation Envoyé par Alba.1337 Voir le message
    Ca a été laborieux pour moi!
    Il n'y a que dans un dictionnaire qu'on trouve le "succès" avant le "travail"
    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]

  20. #20
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ca faisait quelques temps que je voulais réviser les fonctions de fichiers, que j'avais vu quand j'ai appris le C il y a près de 3 ans. Je me suis dit que ce tail allégé était l'occasion. J'ai donc utilisé la technique de Sve@r mais mon code est plus long :

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    // Inclusions des fichiers d'en-tete
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
     
    // Taille du buffer lors du parcours du fichier
    #define TAILLE_LIGNE 200
     
    // Prototypes des fonctions
    void usage(void);
    int stail(const char* nomFichier, const unsigned int nbr);
     
    // Programme
    int main (int argc, const char * argv[])
    { 
        // Declarations des variables
        int codeRetour=1;
        unsigned int nbr = 0;
     
        // Recuperation des arguments et affichage avec stail() si OK
        if(3!=argc)
        {
            puts("Nombre d'arguments invalides");
            usage();
            codeRetour = EXIT_FAILURE;
        }
        else
        {
            //nbr = atoi(argv[2]);
            // Verification que le dernier argument est un nombre
             char *erreurConv;
            nbr = (unsigned int) strtoul(argv[2], &erreurConv, 10);
            if (*erreurConv != '\0')
            {
                puts("Le dernier argument doit etre un nombre entier");
                usage();
                codeRetour = EXIT_FAILURE;
            }
            else
            {
               codeRetour = stail(argv[1], nbr);
            }
        }
     
        //Fin du programme
        return codeRetour;
     
    }//main
     
     
     
    void usage(void)
    {
        puts("--------------------------------------------------------");
        puts("La commande stail affiche la fin d'un fichier");
        puts("stail prend deux arguments en parametres");
        puts("\t- Le premier est le nom du fichier a afficher");
        puts("\t- Le second est le nombre de lignes a afficher");
        puts("--------------------------------------------------------");
    }//usage 
     
     
    int stail(const char* nomFichier, const unsigned int nbr)
    {
        int nbAffichees = nbr;
     
        // Indice de parcours
        int i=0;
     
        // Indicateur d'erreur lors du parcours du fichier / sert aussi de code retour
        int doNotDisplay=0;
     
        // Tampon des positions de debut de lignes
        int *t_positions = malloc(sizeof(int)*100);
     
        // Nombre de lignes dans le fichier
        int nbLignes = 0;
     
        // Tampon de la ligne courante
        char *t_ligne = malloc(sizeof(char)*TAILLE_LIGNE);
     
        FILE *pt_fic = fopen(nomFichier, "r");
        if(NULL==pt_fic)
        {
            printf("Impossible d'ouvrir le fichier %s : (%d) %s\n", nomFichier, errno, strerror(errno));
     
            // On positionne le code retour
            doNotDisplay=1;
        }
        else
        {        
            // La premiere ligne commence maintenant
            *(t_positions+i)=ftell(pt_fic);        
            if(1L==*(t_positions+i))
            {
                perror("Erreur lors de la lecture");
                doNotDisplay=1;
            }
            i+=1;
     
            // Flag de lecture
            int keepReading=1;
     
            // Boucler sur le fichier pour determiner les positions des debuts de lignes
            while( 1 == keepReading )
            {
                // Lecture d'une nouvelle ligne
                t_ligne = fgets(t_ligne, TAILLE_LIGNE, pt_fic);
     
                // On continue a lire ?
                if(t_ligne==NULL)
                {
                    // Stopper la lecture
                    keepReading=0;
     
                    // On determine la cause de l'erreur
                    if(0 != feof(pt_fic))
                    {
                        // Fin du fichier atteinte
                        //puts("Fichier parcouru avec succes");
                    }
                    else
                    {
                        // Autre erreur
                        perror("Erreur lors de la lecture");
     
                        // On n'affichera pas le fichier
                        doNotDisplay=1;
                    }
                }
                else
                {
                    // Ligne lu en entier ou buffer trop petit ?
                    if(NULL==strrchr(t_ligne, '\n'))
                    {
                        //DEBUG
                        //printf("(%dd)%s", i, t_ligne);
     
                        // Buffer trop petit pour contenir la ligne entiere : on continue a lire sans memoriser la position
                    }
                    else
                    {                    
                        //DEBUG
                        //printf("(%d) %s", i, t_ligne);
     
                        // Memorisation de la position
                        *(t_positions+i)=ftell(pt_fic);
                        if(1L==*(t_positions+i))
                        {
                            perror("Erreur lors de la lecture");
                            doNotDisplay=1;
                        }
                        i+=1;
                    }                          
                }
            }//while
     
     
            // --------------------------------------------------------------------------------------------
            // Affichage a la facon de tail si pas d'erreur lors du parcours
            if (1!=doNotDisplay)
            {
                // Tampon de lecture
                char carac=0;
     
                // Nombre de lignes
                nbLignes = i-1;
     
                //printf("\n\nOn finit de lire le fichier. Il y a %d lignes.\nOn va maintenant afficher la fin du fichier, soit les %d dernieres lignes.\n\n", nbLignes, nbAffichees);
     
                // Enlever le flag de fin de fichier
                clearerr(pt_fic);
     
                // Se positionner au bon endroit
                if(nbLignes>nbAffichees)
                {
                    fseek(pt_fic, *(t_positions+nbLignes-nbAffichees), SEEK_SET);                
                }
                else
                {
                    fseek(pt_fic, *(t_positions), SEEK_SET);
                }
     
                // Affichage 
                while ( EOF!=(carac=fgetc(pt_fic)) )
                {
                    putchar(carac);
                }
            }
     
            // Fermeture du fichier
            fclose(pt_fic);
     
        }//Ouverture du fichier
     
        return doNotDisplay;
     
    }//stail
    J'ai juste une question : ma ligne tampon t_ligne provoque une fuite de mémoire au dernier fgets (puisque le pointeur devient égal à NULL). Comment éviter cela ?



    Il n'y a que dans un dictionnaire qu'on trouve le "succès" avant le "travail"
    Joliment dit

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 02/12/2014, 22h25
  2. Remplacement d'un caractère à une position donnée
    Par erustika dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 24/10/2011, 16h35
  3. Réponses: 0
    Dernier message: 23/12/2009, 10h14
  4. Ecriture à une position donné dans un fichier
    Par xarius dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 29/05/2006, 16h05
  5. Inserer du texte à une position donnée dans un Memo
    Par bassim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/11/2005, 17h45

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