Commande Unix wc en C - C - Programmation
Marsh Posté le 20-11-2005 à 20:31:42
ben alors tu veux quoi qu on te le code du debut a la fin
Marsh Posté le 20-11-2005 à 20:35:29
Cela ressemble à un devoir d'étudiant.
Il faudrait que tu cherches par toi-même, et que tu ne viennes demander de l'aide qu'après avoir étudier le problème, avoir commencer, et être bloquer par un obstacle que tu peux décrire.
Cependant, j'ai trouvé le programme suivant dans mes tiroirs :
Code :
|
Marsh Posté le 20-11-2005 à 20:36:48
T'ouvres le fichier, tu lis avec fgets() par exemple, à chaque fin de boucle t'incrémentes le nombre de lignes.
Le nombre de caractères tu peux prendre strlen de la ligne, et un mot c'est separé par un espace donc tu vois avec ça, tu fermes le fichier et t'affiche tes résultats.
Ou alors tu fait un popen sur wc et tu affiche les résultats
Edit: ou alors tu regardes au dessus..
Marsh Posté le 20-11-2005 à 20:36:53
EDIT : multi-grillage, donc inutile d'en rajouter
Marsh Posté le 20-11-2005 à 22:40:06
JustOne72 a écrit : Je voudrais un programme en C qui est identique a la commande wc. |
Tu as oublié
Marsh Posté le 20-11-2005 à 23:42:55
Code :
|
de rien
Marsh Posté le 21-11-2005 à 01:21:12
ReplyMarsh Posté le 21-11-2005 à 07:01:55
gocho a écrit : 596 lignes pour compter lignes, caracteres et mots !! |
Euh, tu l'as lu au moins ? Et compris ?
Non parce que se référer au nombre de lignes d'un source qui compte autant de commentaires, de directives de compilation et de fonctions type "j'affiche l'aide de mon programme", c'est un peu stupide hein.
Qui plus est ce programme compte n fichiers, il évite les cas tordus, et est certainement bien plus rapide que la boucle avec fgetc()
Tiens d'ailleurs c'est le vrai wc celui-là. Celui qui va pas me mettre 15 ans à me sortir le nombre de bytes d'un fichier de 150Mo
Bon évidemment, pour le posteur initial et son devoir d'étudiant, c'est de l'overkill, mais bon le but de Masklinn c'était pas vraiment de l'aider non plus.
Marsh Posté le 21-11-2005 à 10:29:14
Elmoricq a écrit : Celui qui va pas me mettre 15 ans à me sortir le nombre de bytes d'un fichier de 150Mo |
Justement, je me suis posé la question, et voici quelques résultats intéressants (PC Celeron 2.8 GHz/XP)
Le fichier de test est un gros .zip de 219 Mo (donc lecture en binaire)
Test 1 met en oeuvre fgetc()
while ((c = fgetc (fp)) != EOF) |
Test 2 met en oeuvre fread() avec un buffer de BUFSIZ et une lecture par blocs de BUFSIZ bytes.
while ((n = fread (buf, sizeof buf, 1, fp)) > 0) |
Test 3 met en oeuvre fread() avec un buffer de BUFSIZ et BUFSIZ lectures de un byte.
while ((n = fread (buf, 1, sizeof buf, fp)) > 0) |
Résultat :
|
Je vois déjà les cris 'haro sur la lecture byte par byte" etc... Ok?
Poursuivons en inversant les tests :
|
Les choses ne sont plus si claires...
D'autres séquences montrent d'autres résultats.
|
Conclusion, seul le test joué en premier est concluant. Ensuite, les caches faussent complètement les résultats. Se méfier des conclusions hatives, et décrire ses conditions de test...
Le rapport entre fgetc() et fread() n'est finalement de moins de 1 à 2...
Marsh Posté le 21-11-2005 à 10:44:18
Oui mais si on se contente de compter les bytes avec wc, et si on n'est pas dans un cas tordu, il utilise lseek ce qui est quand même plus rapide qu'un parcours exhaustif.
Pour un fichier de plus de 200Mo, il me met 3 ou 4s pour me sortir le nombre de bytes utilisés, c'est plutôt raisonnable.
Et puis on voit quand même que la méthode de lecture par bloc est plus rapide, de "20% environ" sur ton seul exemple, ce n'est pas négligeable ; et je pense qu'on peut encore améliorer ce temps avec une taille de buffer correspondant à la taille du fichier (genre avec 200Mo de fichier, un buffer de 1024 c'est un peu petit).
Mais c'est sûr que le cache fausse carrément les résultats. Et j'ai mis "20% environ" entre guillemets parce que d'autres facteurs interviennent, genre ce que fait le disque dur à ce moment-là, ce que le système décide de t'accorder comme temps, la fragmentation du fichier etc...
Marsh Posté le 21-11-2005 à 10:45:49
Elmoricq a écrit : Tiens d'ailleurs c'est le vrai wc celui-là. Celui qui va pas me mettre 15 ans à me sortir le nombre de bytes d'un fichier de 150Mo |
Yay, GNU WC for the win
Tiré directement de Textutils
Marsh Posté le 20-11-2005 à 20:28:54
Bonjour
Je voudrais un programme en C qui est identique a la commande wc.
Il faut que ce programme compte le nombre de caracteres, de mots et de lignes d'un fichier passé en paramètre.
Exemple :
wc fichier.txt
nb de caracteres : 658
nb de mots : 137
nb de lignes : 32
Merci pour votre aide