Bonjour a tous,
je voudrais savoir comment connaitre le nombre de caractère contenu dans un fichier en langage c
comme l'exemple du fichier joint
merci d'avance
:help:
Version imprimable
Bonjour a tous,
je voudrais savoir comment connaitre le nombre de caractère contenu dans un fichier en langage c
comme l'exemple du fichier joint
merci d'avance
:help:
Une première réponse brutale, tu regardes la taille du fichier (56 dans ton exemple) et c'est le nombre de caractères de ton fichier.
Mais je suppose que tu veux la jouer plus fin et ne pas comptabiliser les retour chariot par exemple.
Dans ce cas, il faut lire le fichier caractère par caractère et compter ceux que tu veux comptabiliser.
Bonjour, voici un petit exemple pour lire un fichier et compter le nombre de caractères (espaces, retours charriots compris):
J'espère avoir pu t'aider. Charge à toi de l'adapter.Code:
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> int main(int argc, char ** argv) { int compteur = 0; FILE * file; /* ouverture du fichier */ if ((file = fopen("ematrix.txt", "r")) == NULL) perror("Erreur à l'ouverture du fichier"); else { /* parcours du fichier */ while(fgetc(file) != EOF) compteur ++; /* incrémentation du compteur */ } printf("Le nombre de caractères du fichier est de : %d\n", compteur); /* fermeture du fichier */ fclose(file); return 0; }
merci pour votre reponse,
et si je veux connaitre le nombre de ligne et classer le contenu du fichier par ordre alphabetique, comme l'exemple du fichier joint.
merci d'avance
:help:
Pour compter le nombre de lignes, tu peux compter le nombre de '\n' dans le fichier...
Pour le tri, qsort peut faire l'affaire.
Même réponse que précédent sauf que ce coup ci, tu compte les retours chariots
- Lire le fichier ligne par ligne
- stocker en mémoire toute les lignes
- trier les lignes stockées en mémoire (il va falloir que tu définisse ta fonction de tri, tri alphabétique, tri croissant sur la 3eme colonne puis décroissant sur la 5eme colonne, toutes les fantaisies sont possibles)
- re écrire le fichier en ecrivant les lignes triées
merci encore,
un exemple en code ne me fera pas du mal.
merci d'avance
A un moment, il faut se lancer et remonter les manches. Tu as déjà pas mal d'idées et de code dans ce post.
Présente nous ce que tu as fais et on t'aidera
Ce code, bien sûr est à améliorer/corriger en prenant garde aux effets de bords, à la syntaxe et aux fonctions que j'utilise de tête.Code:
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 #include <stdio.h> int main(int argc, char ** argv) { /* tableau de tri */ char tab[100][1024]; /* compteur de caractères */ int compteur = 0; /* compteur de lignes */ int cptLigne = 0; /* compteur de caracteres dans une ligne */ int cptCarLigne = 0; /* fichier */ FILE * file; /* caractère récupéré */ int car; int i = 0; /* ouverture du fichier */ if ((file = fopen("ematrix.txt", "r")) == NULL) perror("Erreur à l'ouverture du fichier"); else { /* parcours du fichier */ while((car=fgetc(file)) != EOF){ compteur ++; /* incrémentation du compteur */ cptCarLigne ++; if (car == "\n"){ tab[cptLigne][cptCarLigne-1] = "\0"; cptLigne ++; cptCarLigne = 0; } tab[cptLigne][cptCarLigne-1] = car; } /* Appel de ta fonction tri */ tri(tab); printf("Le nombre de caractères du fichier est de : %d\n", compteur); /* fermeture du fichier */ fclose(file); /* Ecriture dans le fichier */ if ((file = fopen("ematrix.txt", "w")) == NULL) perror("Erreur à l'ouverture du fichier"); for (i; i < cptLigne; i ++) { fprintf(file, "%s", tab[cptLigne]); } fclose (file); return 0; }
Pour le tri, tu peux voir ici :
http://c.developpez.com/sources/?pag...HME_tri_rapide
En gros, autant éviter de le lire quoi...
tu m'expliqueras un jour le concept de nombre négatif de ligne, ou de nombre de caractère négatif dans un fichier, ça m'intéresse.
et je ne parle pas du fait de mettre une chaine dans un caractère:
Code:
1
2 if (car == "\n"){ /* <= are you crazy???? */ tab[cptLigne][cptCarLigne-1] = "\0"; /* <= WTF? */
Bonsoir a tous;
comment recuperer chaque ligne d'un fichier pour ensuite le mettre dans un tableau
merci d'avance
Merci de ton intervention. Super constructive, pleine de respect et d'humilité.
Je ne suis pas là pour écrire le code de mipou, juste lui donner des pistes pour qu'il puisse de lui-même résoudre son problème.
Je précise donc que mon code n'est pas à suivre à la lettre mais plus à voir comme un squelette.
Confondre les quotes " et ' : je suis sincèrement désolé.
Toujours pas compris. Si tu parles de ça :mes compteurs sont incrémentés avant d'arriver sur cette ligne. Ils sont incrémentés une fois de trop. Je suis désolé de pas avoir écrit un code optimisé.Code:tab[cptLigne][cptCarLigne-1]
Tu utilises fgets() et tu prévois suffisamment d'espace dans ton tableau pour y stocker la chaîne entière.
bonjour a tous,
mon code en pièce-joint permet de compter et afficher les lignes d'un fichier.
maintenant je veux classer les lignes par ordre alphabétique.
comment pourrai-je procéder pour classer le contenu du fichier, qui se presente comme suit:
mipou
yoda
abiba
kassouya
gmahan
doss
merci d'avanceCode:
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 #include <stdio.h> #include <stdlib.h> int main(){ char tab_ligne[15][9]; int nb_lignes,i; char ligne_lue[512]; char nom_fic[255]; FILE * file; if ((file = fopen("ematrix.txt", "r")) == NULL){ perror("Erreur a l'ouverture du fichier pour lecture..."); } printf("Ouverture du fichier %s\n", nom_fic); // compter et afficher les lignes du fichier nb_lignes = 0; while(fgets(ligne_lue,512,file) != NULL){ printf("\t%s", ligne_lue); nb_lignes++; } printf("\nle fichier %s comporte %d lignes\n", nom_fic, nb_lignes); printf("le fichier est en train de se fermer......"); fclose(file); return 0; for(i=0;i<=nb_lignes;i++){ } }
:arf:
Voilà un exemple, qui peut être améliorer:
Code:
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 #include <stdlib.h> #include <stdio.h> #include <string.h> #define FILENAME "ematrix.txt" #define INCREMENT_SIZE 10 #define BUFFER_SIZE BUFSIZ /** * @fn static int compare (void const * a, void const * b) * @frief used to sort lines (called by qsort) */ static int compare (void const * a, void const * b) { return strcmp(*(char const * const *) a, *(char const * const *) b); } int main(void) { FILE * file = fopen(FILENAME, "r"); if(file == NULL) { perror("Can't open " FILENAME); } else { unsigned long nb_lignes = 0; /** number of lines stored in tab */ size_t old_len = 0; /** used if line > BUFFER_SIZE */ size_t current_size = 0; /** size of tab in lines */ char ** tab = NULL; /** tab of lines */ char buffer[BUFFER_SIZE]; puts(FILENAME " opened"); while(fgets(buffer, sizeof buffer, file) != NULL) { size_t const buf_len = strlen(buffer); printf("%s", buffer); /** check if there is place in tab to store new line, if condition is true, there isn't enough place */ if(nb_lignes == current_size) { size_t new_size = current_size + INCREMENT_SIZE; char ** tmp = realloc(tab, new_size * sizeof *tmp); if(tmp == NULL) { perror("realloc"); break; } else { tab = tmp; for(size_t i = current_size; i < new_size; i++) { tab[i] = NULL; } current_size = new_size; } } /** if it is a new line, realloc acts like malloc, otherwise, we are in the case where line length is greater than buffer length, so we realloc */ char * tmp = realloc(tab[nb_lignes], (old_len + buf_len + 1) * sizeof *tmp); if(tmp == NULL) { perror("realloc"); break; } else { tab[nb_lignes] = tmp; /** if it is a new line, old_len is 0 and strcpy acts as usual, if the line length is greater, old_len provides the old length of line, and strcpy acts like strcat */ strcpy(tab[nb_lignes] + old_len, buffer); } /** here, we determine if line length is greater than buffer length */ if(tab[nb_lignes][old_len + buf_len - 1] == '\n') { nb_lignes++; old_len = 0; } else { old_len += buf_len; } } printf("\nle fichier " FILENAME " comporte %lu lignes\n", nb_lignes); qsort(tab, nb_lignes, sizeof *tab, compare); /** sort lines here */ for(size_t i = 0; i < current_size && tab[i] != NULL; i++) { printf("%s", tab[i]); free(tab[i]), tab[i] = NULL; } free(tab), tab = NULL; fclose(file), file = NULL; } return 0; }
j'ajoute que sur sytèmes unixoides la commande wc (wc = word count) fait tout ça toute seule :P