[C][Améliorations] Manipulations de fichiers
Fermé
lucas-84
Messages postés
35
Date d'inscription
dimanche 17 octobre 2010
Statut
Membre
Dernière intervention
7 décembre 2011
-
24 oct. 2011 à 17:24
lucas-84 Messages postés 35 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 7 décembre 2011 - 27 oct. 2011 à 12:32
lucas-84 Messages postés 35 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 7 décembre 2011 - 27 oct. 2011 à 12:32
A voir également:
- [C][Améliorations] Manipulations de fichiers
- Wetransfer gratuit fichiers lourd - Guide
- Explorateur de fichiers - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Fichiers bin - Guide
- Fichiers epub - Guide
6 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
24 oct. 2011 à 20:56
24 oct. 2011 à 20:56
Bonjour,
L'écriture de ton code est bien. C'est bien commenté.
En revanche, je ne suis vraiment pas fan des macros comme tu as fait. Et d'ailleurs ce n'est pas conseillé.
Il vaut mieux utiliser une fonction statique.
Sinon pas grand chose à dire.
L'écriture de ton code est bien. C'est bien commenté.
En revanche, je ne suis vraiment pas fan des macros comme tu as fait. Et d'ailleurs ce n'est pas conseillé.
Il vaut mieux utiliser une fonction statique.
Sinon pas grand chose à dire.
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
24 oct. 2011 à 23:31
24 oct. 2011 à 23:31
Bonjour,
Essayez une seconde version avec buffer pour la lecture d'un fichier, à la place de getc. En utilisant fseek et fread uniquement quand on arrive au bout du buffer enfin c'est pour remplacer le getc parce que j'ai l'impression que ce sera très long sur les gros fichiers. Pour le fprintf aussi utilisez un buffer et n'affichez que lorsqu'il est plein ou fin du fichier car là il n'est utilisé que pour un seul caractère à la fois alors qu'on sait qu'il va y en avoir bien plus c'est pas le top. Je vous conseil en lecture et écriture de faire comme si vous manipulez du binaire et pas des chaînes de caractères car en fonction des encodages (ceux qui utilisent le caractère null dans le code des caractères par exemple) ça risque de poser des problèmes.
Essayez une seconde version avec buffer pour la lecture d'un fichier, à la place de getc. En utilisant fseek et fread uniquement quand on arrive au bout du buffer enfin c'est pour remplacer le getc parce que j'ai l'impression que ce sera très long sur les gros fichiers. Pour le fprintf aussi utilisez un buffer et n'affichez que lorsqu'il est plein ou fin du fichier car là il n'est utilisé que pour un seul caractère à la fois alors qu'on sait qu'il va y en avoir bien plus c'est pas le top. Je vous conseil en lecture et écriture de faire comme si vous manipulez du binaire et pas des chaînes de caractères car en fonction des encodages (ceux qui utilisent le caractère null dans le code des caractères par exemple) ça risque de poser des problèmes.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
25 oct. 2011 à 08:22
25 oct. 2011 à 08:22
Hxyp,
Pas besoin pour printf sur stdout.
Cdlt
Pas besoin pour printf sur stdout.
Cdlt
lucas-84
Messages postés
35
Date d'inscription
dimanche 17 octobre 2010
Statut
Membre
Dernière intervention
7 décembre 2011
6
Modifié par lucas-84 le 25/10/2011 à 09:51
Modifié par lucas-84 le 25/10/2011 à 09:51
Merci à vous pour vos commentaires.
fiddy > pour les macros, c'est un peu embêtant, parce que je suis obligé de les utiliser pour obtenir la valeur de __FILE__ et de __LINE__. Du coup, j'ai fait ça (code pas encore commenté avec Doxygen) :
error.h :
error.c :
Hxyp > j'y réfléchis pour la lecture des fichiers avec le binaire, merci ! Je ne connais pas Trop les fonctions qui s'y rapportent , mais ça me fera apprendre.
fiddy > pour les macros, c'est un peu embêtant, parce que je suis obligé de les utiliser pour obtenir la valeur de __FILE__ et de __LINE__. Du coup, j'ai fait ça (code pas encore commenté avec Doxygen) :
error.h :
/** * \file error.h * \brief macros de gestion des erreurs * \author lucas-84 * \version V0.2 on 25/10/2011 * \date 24/10/2011 * * Declare les fonctions d'error.c et quelques macros de gestion des erreurs. * */ #ifndef ERROR_H #define ERROR_H #define PRINT_ERROR(s) \ do { \ print_error (s, __FILE__, __LINE__) ; \ } while (0) #define PRINT_ERROR_ARG_FUNCTIONS(s) \ do { \ print_error_arg_functions (s, __FILE__, __LINE__); \ } while (0) /** * \enum ret_e * \brief Constantes d'erreurs. * * Str_err_e est un type de retour des fonctions de file.c indiquant si une * erreur s'est produite ou pas. */ typedef enum { RET_ERROR = -1, RET_SUCCESS = 1 } ret_e; void print_error (const char *, const char *, int); void print_error_arg_main (void); void print_error_arg_functions (const char *, const char *, int); #endif
error.c :
/** * \file error.c * \brief fonction de signalisation des erreurs * \author lucas-84 * \version V0.2 on 25/10/2011 * \date 24/10/2011 * * Definit trois fonctions qui signalent a l'utilisateur une erreur. * */ #include <errno.h> #include <stdio.h> #include <string.h> void print_error (const char *s, const char *f, int l) { (void) fprintf(stderr, "----------------------------------------" "----------------------------------------\n" "\t\t\t\t\tERROR\n\n" "Fonction : %s\n" "File : %s\n" "Line : %d\n" "Description : %s\n" "----------------------------------------" "----------------------------------------\n", s, f, l, strerror(errno)); } void print_error_arg_main (void) { (void) fputs ("----------------------------------------" "----------------------------------------\n" "\t\t\t\t\tERROR\n\n" "Invalid argument.\n" "Synopsis : ./zReader [OPTIONS] [FILE]\n" "Options :\n" " -c : create file\n" " -r : read file\n" " -w : write file\n" "----------------------------------------" "----------------------------------------\n", stderr); } void print_error_arg_functions (const char *s, const char *f, int l) { (void) fprintf(stderr, "----------------------------------------" "----------------------------------------\n" "\t\t\t\t\tERROR\n\n" "Fonction : %s\n" "File : %s\n" "Line : %d\n" "Description : bad argument\n" "----------------------------------------" "----------------------------------------\n", s, f, l); }
Hxyp > j'y réfléchis pour la lecture des fichiers avec le binaire, merci ! Je ne connais pas Trop les fonctions qui s'y rapportent , mais ça me fera apprendre.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
25 oct. 2011 à 20:19
25 oct. 2011 à 20:19
fiddy > pour les macros, c'est un peu embêtant, parce que je suis obligé de les utiliser pour obtenir la valeur de __FILE__ et de __LINE__.
Tu peux très bien faire : printf("__LINE__=%d\n",__LINE__); sans passer par une macro.
Je ne vois pas ce qui t'oblige à utiliser les macros. Peux-tu m'éclairer ?
Tu peux très bien faire : printf("__LINE__=%d\n",__LINE__); sans passer par une macro.
Je ne vois pas ce qui t'oblige à utiliser les macros. Peux-tu m'éclairer ?
lucas-84
Messages postés
35
Date d'inscription
dimanche 17 octobre 2010
Statut
Membre
Dernière intervention
7 décembre 2011
6
27 oct. 2011 à 12:32
27 oct. 2011 à 12:32
Le problème, c'est que si j'utilise les macros directement dans la fonction, j'aurais le fichier et la ligne de ma fonction erreur. Impossible donc de différencier les erreurs.
Alors que la macro s'intègre directement dans le code où l'erreur s'est produite, donc on obtient la ligne où j'appelle mon PRINT_ERROR().
Enfin, il me semble, non ?
Alors que la macro s'intègre directement dans le code où l'erreur s'est produite, donc on obtient la ligne où j'appelle mon PRINT_ERROR().
Enfin, il me semble, non ?