[C] Programme pour manipuler ses fichiers
Fly_it
Messages postés
1
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
J'aimerais obtenir votre avis sur ce code, qui est censé permettre à l'utilisateur la lecture, l'écriture et la création de fichiers.
J'aimerais obtenir votre avis sur ce code, qui est censé permettre à l'utilisateur la lecture, l'écriture et la création de fichiers.
/* main.c */
#include <stdio.h>
#include <stdlib.h>
static void purger(void);
/*@null@*/static char * get_text(FILE *, int);
/*@null@*/static char * get_filename(void);
/*@null@*/static char * get_contents(FILE *);
/*@null@*/static char * get_input(void);
static int get_choice(void);
static int read_file(void);
static int create_file(void);
static int write_file(void);
int main(void) {
int ret = -1;
int choice = get_choice();
switch (choice) {
case 1:
ret = read_file();
break;
case 2:
ret = create_file();
break;
case 3:
ret = write_file();
break;
default:
break;
}
if (ret == -1) {
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
void purger(void) {
int c;
do {
c = getchar();
} while (c != (int)'\n' && c != EOF);
}
char * get_text(FILE * f, int end_caracter) {
size_t n = 8;
char * s = malloc(n * sizeof *s);
if(s != NULL) {
size_t i = 0;
unsigned int e = 1;
do {
if (i + 2 > n) {
s = realloc(s, n + e);
if (s == NULL) {
perror("realloc");
return NULL;
}
n += e;
e *= 2;
}
s[i++] = (char)fgetc(f);
} while(s[i - 1] != (char)end_caracter);
s[i - 1] = '\0';
return s;
}
perror("malloc");
return NULL;
}
char * get_filename(void) {
(void)fprintf(stdout, "Nom du fichier : ");
return get_text(stdin, (int)'\n');
}
char * get_contents(FILE * f) {
(void)fputs("Contenu du fichier : ", stdout);
return get_text(f, EOF);
}
char * get_input(void) {
(void)fputs("Contenu du fichier : ", stdout);
return get_text(stdin, EOF);
}
int get_choice(void) {
int choice;
int ret;
(void)fputs("1. Lire un fichier\n"
"2. Créer un fichier\n"
"3. Ecrire dans un fichier\n\n", stdout);
do {
(void)fprintf(stdout, "Votre choix ? ");
ret = scanf("%d", &choice);
purger();
} while (ret == EOF || choice < 1 || choice > 3);
return choice;
}
int read_file(void) {
char * s_filename = get_filename();
if (s_filename == NULL) {
return -1;
} else {
FILE * f = fopen(s_filename, "w");
free(s_filename);
if (f == NULL) {
perror("fopen");
return -1;
} else {
char * s_contents = get_contents(f);
if (s_contents == NULL) {
return -1;
}
(void)fputs(s_contents, stdout);
free(s_contents);
if (fclose(f) == EOF) {
perror ("fclose");
return -1;
}
}
}
return 0;
}
int create_file(void) {
char * s_filename = get_filename();
if (s_filename == NULL) {
return -1;
} else {
FILE * f = fopen(s_filename, "w");
free(s_filename);
if (f == NULL) {
perror("fopen");
return -1;
}
if (fclose(f) == EOF) {
perror("fclose");
return -1;
}
}
return 0;
}
int write_file(void) {
char * s_filename = get_filename();
if (s_filename == NULL) {
return -1;
} else {
FILE * f = fopen(s_filename, "w");
free(s_filename);
if (f == NULL) {
perror("fopen");
return -1;
} else {
char * s_input = get_input();
if (s_input == NULL) {
return -1;
}
(void)fputs(s_input, f);
free(s_input);
if (fclose(f) == EOF) {
perror ("fclose");
return -1;
}
}
}
return 0;
}
A voir également:
- [C] Programme pour manipuler ses fichiers
- Programme demarrage windows - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Renommer des fichiers en masse - Guide
- Fichiers epub - Guide
- Wetransfer gratuit fichiers lourd - Guide
1 réponse
Pas besoin de caster '\n' en int. ('\n' est déjà un int).
Par exemple : while (c != '\n' && c != EOF);
size_t n = 8;
char * s = malloc(n * sizeof *s);
Pourquoi ne pas allouer statiquement si la valeur est connue à l'avance ?
Sinon, j'ai pas tout épluché, mais ton code est propre.
Il ne reste plus qu'à documenter ;-))).
Cordialement,
Par exemple : while (c != '\n' && c != EOF);
size_t n = 8;
char * s = malloc(n * sizeof *s);
Pourquoi ne pas allouer statiquement si la valeur est connue à l'avance ?
Sinon, j'ai pas tout épluché, mais ton code est propre.
Il ne reste plus qu'à documenter ;-))).
Cordialement,
Sinon, je ne l'ai pas alloué statiquement afin de pouvoir le reallouer par la suite avec realloc.