comment faire pour que lorsque l'on ouvre un fichier texte en lecture à l'aide de "fopen", on puisse aussi connaître le nombre de ligne qu'il comporte?
comment faire pour que lorsque l'on ouvre un fichier texte en lecture à l'aide de "fopen", on puisse aussi connaître le nombre de ligne qu'il comporte?
Il faut compter le nombre de fin de ligne (ie le nombre de retour chariot), ou encore compter le nombre de fois que l'on a pu exécuter fgets.
En tout cas, en C, il n'y a pas de fonction qui réalise cela directement.
Pas fiable, car on peut très bien tomber sur une ligne trop grande pour la chaine de destination.Envoyé par PRomu@ld
Il vaut mieux parcourir avec fgetc() et compter les '\n'. C'est beaucoup plus fiable.
Est-ce vraiment un problème ? Il faut pister simplement le '\n' àprès chaque fgets.Envoyé par Emmanuel Delahaye
Je me pose toujours la questiopn, sans avoir aucune réponse (si tant est qu'il y en a une) la lecture par fgets est-elle plus rapide que la lecture par fgetc si on choisit bien la taille du buffer (BUFSIZE par exemple ?)
Il faudrait regarder l'implémentation de fgets, mais il y a des chances pour que fgets utilise fgetc ... (je n'en sais strictement rien ...)
Du coup, pour ce qui est des perfs, ça n'est peut être pas énorme comme différence. (en tout cas tant que les E/S sont bufferisées)
Ce qui est une façon très compliquée de faireEnvoyé par Trap D
(j'ai évité l'ésotérique n += c == '\n'; )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 n=0; while ((c = fgetc(fp)) != EOF) { if (c == '\n') { n++; } }
Il n'y a pas de réponse générale, car ça dépend de l'implémentation. Il faut faire des mesures.Je me pose toujours la questiopn, sans avoir aucune réponse (si tant est qu'il y en a une) la lecture par fgets est-elle plus rapide que la lecture par fgetc si on choisit bien la taille du buffer (BUFSIZE par exemple ?)
merci emmanuel pour le bout de code. J'immagine que "c" doit être une variable de type caractère? Ce code ne fonctionne pas:
lors de la compilation il me dit :"syntax error before '{' token" au niveau de mon "while"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 FILE *file; file=fopen("texte.txt","r"); char c; int n; while ((c=fgetc(file)!=EOF) { if(c=='\n') { n++; } }
Bonjour,
Pourquoi avoir enlevé leEnvoyé par mrtatou
essai ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part n = 0;
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 #include <stdio.h> int nb_lignes (FILE *fp) { int n=0, c; while ((c = fgetc(fp)) != EOF) { if (c == '\n') { n++; } } return n; }
gege2061 n'a pas assez insisté, il FAUT que c soit un int.
Là ou moins si c'est pas clair, j'y peux rien, merciEnvoyé par Trap D
La raison
ok merci.
bon j'arrive à compter mon nombre de lignes mais du coup quand je met à la suite de mon code mon "gets" ca ne passe plus.
c'est à dire qu'indépendamment le "gets" passe mais dès que je met au dessus mon code avec le "getc" ca ne fonctionne plus...
que faire?
Pour commencer, ne pas utiliser gets(). (cette fonction ne devrait pas exister, utiliser fgets() à la place).
Ensuite, poste ton code: On pourra essayer de voir ce qui ne va pas...
voici mon code:
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 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i,c; int n=0; //ouverture du fichier texte FILE *file; file=fopen("texte.txt","r"); if (file==NULL) { printf("impossible d'ouvrir le fichier spécifié"); } //compter le nombre de lignes du fichier et stockage dans n while (c=fgetc(file)!=EOF) { if(c=='\n') { n++; } } printf ("%d\n",n); //création du tableau avec n lignes char tab1[n][256]; for (i=0;i<=n;i++) { fgets(tab1[i],sizeof tab1[i],file); } //affichage pour vérification for (i=0;i<4;i++) { printf ("%s",tab1[i]); } }
Voici un warning important:
test.c:19: warning: suggest parentheses around assignment used as truth valueDevrait être:
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (c=fgetc(file)!=EOF)
Ensuite, ta fonction main retourne un entier... Il n'y a pas de return dans ton main...
Code : Sélectionner tout - Visualiser dans une fenêtre à part while ((c=fgetc(file))!=EOF)
Un devrait se trouver en dessous de ton printf...
et un à la fin du main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if (file==NULL) { printf("impossible d'ouvrir le fichier spécifié"); return EXIT_FAILURE; }
EDITION: c'est bien sûr 0 à la place du 1!
Code : Sélectionner tout - Visualiser dans une fenêtre à part return 1;
Jc
Une fois que tu as compte tes lignes, tu te trouves a la fin de ton fichier. Si tu veux le lire une deuxieme fois, ligne par ligne, il faut revenir au debut:
Note que tu peux tout faire en seul passage, en utilisant fgets() et en increment le nombre de lignes a la volee (il faut juste que le tableau de destination soit plus grand que la ligne la plus grande du fichier).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 rewind(file);
Le copier/coller n'est pas disponible sur ton système mrtatou?Envoyé par fearyourself
Un coup de fatigue ?Envoyé par fearyourself
Trop... 1000 apologies...Envoyé par gege2061
[délire dû au manque de sucre...]
Non, j'en ai marre de retourner 0 quand ça marche, je vais modifier le standard!!!!!!!!
[/Pris un kitkat... Délire dû au manque de sucre fini...]
un grand merci à tous!!!!
je commence enfin à m'en sortir grâce à vous tous....
je suis désolé de mes erreurs de débutant, je commence la programmation je fai un stage en fait là.
merci encore
Tu es sûr de ce que tu dis là ??Envoyé par fearyourself
Reprends un peu de sucre
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager