Votre question

[C][Améliorations] Programme de manipulations de fichiers

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
24 Octobre 2011 17:38:25

Bonjour,

Je vous présente un petit programme de manipulation de fichiers. Je suis à la recherche de remarques, critiques, etc, vu que je ne programme que depuis un an.

Voici le code :

/**
* \file main.c
* \brief gere les arguments du main()
* \author lucas-84
* \version 0.1
* \date 24/10/2011
*
* Gere les arguments du main() d'un programme de manipulation de fichiers.
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "error.h"
#include "file.h"

/**
* \fn int main (void)
* \brief Entrée du programme.
*
* \return EXIT_FAILURE en cas d'erreur, EXIT_SUCCESS sinon.
*/
int main (int argc, char *argv[])
{
const char *args[] = {"-c", "-r", "-w"};
ret_e (*handle_file) (const char *);

if (argc <= 1) {
PRINT_ERROR_ARG_MAIN ();
return EXIT_FAILURE;
}
if (strcmp (argv[1], args[0]) == 0) {
handle_file = create_file;
} else if (strcmp (argv[1], args[1]) == 0) {
handle_file = read_file;
} else if (strcmp (argv[1], args[2]) == 0) {
handle_file = write_file;
} else {
PRINT_ERROR_ARG_MAIN ();
return EXIT_FAILURE;
}
if (handle_file (argv[2]) == RET_ERROR) {
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}


/****************************************************************************
Name ........ : file.c
Role ........ : handles files
Author ..... : lucas-84
Version ..... : V0.1 on 24/10/2011

Compilation :
gcc -Wall -pedantic -std=c99 -o zReader main.c file.c error.c
Execution :
./zReader [OPTIONS] [FILE]
****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "error.h"
#include "file.h"

/**
* \fn static ret_e open_file (const char *path, const char *mode)
* \brief Ouvre un fichier
*
* \param path pointeur vers une chaine de caractere indiquant le chemin du
* fichier a creer.
* \param mode pointeur vers une chaine de caractere indiquant le mode
* d'ouverture du fichier a creer.
* \return NULL en cas d'erreur, le fichier ouvert sinon.
*/
/*@null@*/ static FILE *open_file (const char *path, const char *mode)
{
FILE *f = NULL;
if ((f = fopen (path, mode)) == NULL) {
PRINT_ERROR ("fopen");
return NULL;
}
return f;
}

/**
* \fn static ret_e close_file (FILE *f)
* \brief Ferme un fichier
*
* \param f fichier a fermer.
* \return RET_ERROR en cas d'erreur, RET_SUCCESS sinon.
*/
static ret_e close_file (FILE *f)
{
if (fclose (f) == EOF) {
PRINT_ERROR ("fclose");
return RET_ERROR;
}
return RET_SUCCESS;
}

/**
* \fn ret_e create_file (const char *path)
* \brief Cree un fichier
*
* \param path pointeur vers une chaine de caractere indiquant le chemin du
* fichier a creer.
* \return RET_ERROR en cas d'erreur, RET_SUCCESS sinon.
*/
ret_e create_file (const char *path)
{
FILE *f = NULL;

if ((f = open_file (path, "w")) == NULL) {
return RET_ERROR;
}
if (close_file (f) == RET_ERROR) {
return RET_ERROR;
}
return RET_SUCCESS;
}

/**
* \fn ret_e read_file (const char *path)
* \brief Lit un fichier
*
* \param path pointeur vers une chaine de caractere indiquant le chemin du
* fichier a creer.
* \return RET_ERROR en cas d'erreur, RET_SUCCESS sinon.
*/
ret_e read_file (const char *path)
{
FILE *f = NULL;
int c;

if ((f = open_file (path, "r")) == NULL) {
return RET_ERROR;
}
while ((c = fgetc (stdin)) != EOF) {
(void) fprintf (stdout, "%c", c);
}
if (close_file (f) == RET_ERROR) {
return RET_ERROR;
}
return RET_SUCCESS;
}

/**
* \fn ret_e write_file (const char *path)
* \brief Ecrit un fichier
*
* \param path pointeur vers une chaine de caractere indiquant le chemin du
* fichier a creer.
* \return RET_ERROR en cas d'erreur, RET_SUCCESS sinon.
*/
ret_e write_file (const char *path)
{
FILE *f = NULL;
char s[LINE_MAX] = "";

if ((f = open_file (path, "a+")) == NULL) {
return RET_ERROR;
}
(void) fprintf (stdout, "\"/quit\" to stop\n");
while (fgets (s, (int) sizeof (s), stdin) != NULL &&
strstr (s, "/quit") == 0) {
(void) fputs (s, f);
}
if (close_file (f) == RET_ERROR) {
return RET_ERROR;
}
return RET_SUCCESS;
}


/****************************************************************************
Name ........ : file.h
Role ........ : declares file.c functions
Author ..... : lucas-84
Version ..... : V0.1 on 24/10/2011

Compilation :
gcc -Wall -pedantic -std=c99 -o zReader main.c file.c error.c
Execution :
./zReader [OPTIONS] [FILE]
****************************************************************************/

#ifndef FILE_H
#define FILE_H

#include "error.h"

#define LINE_MAX 512

ret_e create_file (const char *);
ret_e read_file (const char *);
ret_e write_file (const char *);

#endif


/****************************************************************************
Name ........ : error.h
Role ........ : declares error.c functions
Author ..... : lucas-84
Version ..... : V0.1 on 24/10/2011

Compilation :
gcc -Wall -pedantic -std=c99 -o zReader main.c file.c error.c
Execution :
./zReader [OPTIONS] [FILE]
****************************************************************************/

#ifndef ERROR_H
#define ERROR_H

#include <errno.h>
#include <stdio.h>
#include <string.h>

#define PRINT_ERROR(s) \
do { \
(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, __FILE__, __LINE__, strerror(errno)); \
} while (0)


#define PRINT_ERROR_ARG_MAIN() \
do { \
(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", stdout); \
} while (0)

#define PRINT_ERROR_ARG_FUNCTION(s) \
do { \
(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, __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;

#endif


Merci d'avance et bonne journée,
Lucas-84

Autres pages sur : ameliorations programme manipulations fichiers

a b L Programmation
24 Octobre 2011 22:58:54

Edite ton code avec les tags de code, on voit pas la couleur ni l'indentation. :) 
a c 232 L Programmation
24 Octobre 2011 23:07:26

c'est moi qui ai enlevé les balises code, il y a un soucis avec le paseur de code depuis la nlouvelle version. Dès que le code est un peu trop long, le post apparait vide...
J'ai déjà remonté le bug depuis un moment, ça devrait être corrigé d'ici quelques jours... j'espère, mais pour le moment quand y'au n peu trop de code, pas d'autre moyen que d'utiliser une autre balise :( 
a b L Programmation
25 Octobre 2011 20:32:04

Ah OK, alors je vais attendre.

Désolé lucas-84@guest, je reviendrai peut-être plus tard.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS