Lire dans un fichier en C
momoadmo
Messages postés
6
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
j'aimerai savoir comment je doit procéder afin de pouvoir créer une fonction qui lit dans un fichier, or le nom de fichier est contenu dans une variable qui varie bien évidement selon les besoins ,Merci d'avance. :)
lorsque je remplace le x par un nom de fichier le programme marche mais lorsque je veut que ce soit une variable il bloque.
j'aimerai savoir comment je doit procéder afin de pouvoir créer une fonction qui lit dans un fichier, or le nom de fichier est contenu dans une variable qui varie bien évidement selon les besoins ,Merci d'avance. :)
lorsque je remplace le x par un nom de fichier le programme marche mais lorsque je veut que ce soit une variable il bloque.
int main()
{
char* x;
printf("Entrez x:");
scanf("s",x);
FILE* fichier = NULL;
int caractereActuel = 0;
fichier = fopen(x, "r");
if (fichier != NULL)
{
do
{
caractereActuel = fgetc(fichier);
printf("%c", caractereActuel);
} while (caractereActuel != EOF);
fclose(fichier);
return 0;
}
}
1 réponse
-
Salut,
Bon déjà tu as codé comme un (GROS)cochon, un petit effort de ce côté là ferait vraiment pas de mal.
Ensuite je ne vois pas dans ton code où est ce que tu essaie d'ouvrir un fichier avec une "variable"?
Ensuite ça : -> scanf("s",x); c'est weird.
-> scanf("%s",x); ça me semble déjà plus conforme
De plus tu as oublié une accolade pour ton if.-
Au minimum :
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char* x;
printf("Entrez x:");
scanf("%s",x);
FILE* fichier = NULL;
int caractereActuel = 0;
fichier = fopen(x, "r");
if (fichier == NULL){
printf("fichier inexistant\n");
}
while (caractereActuel != EOF)
{
caractereActuel = fgetc(fichier);
printf("%c", caractereActuel);
}
fclose(fichier);
return 0;
} -
juste quelques observations :-)
si on n'alloue pas de mémoire pour le pointeurx
, il ne va rien arriver de bon quandscanf()
tentera d'y mettre quelque chose ;-) ... c'est même certainement l’origine de l'erreur expérimentée par momoadmo.
l'inclusion de#include <string.h>
n'est pas nécessaire, pareil pour#include <stdlib.h>
.
en C, le prototype correct de main sans arguments estint main(void)
sur le forum, la balise de code correcte pour la coloration syntaxique du C est :
<code c>
code ici
</code>
Dal -
Ah oui effectivement pas bien de ne pas avoir malloc, je me demande d'ailleurs pourquoi ça fonctionne...
Bon après pour le int main (void) c'est un peu le cadet de ses soucis ahah, mais tu as raison.
Autant pour moi pour le %s je pensais que ça venait de string.h, je l'inclus toujours quand j'utilise des string, j'avoue que je ne m'étais jamais posé la question !
Malheureusement je ne peux pas éditer mon code ...
YCN- -
pour éviter les complications de
malloc()
, momoadmo pourrait réserver la mémoire nécessaire au stockage du nom de fichier en déclarant un tableau de char, par exemple :char x[255];
.
pour faire un code plus robuste, Il serait bien, aussi, de s'assurer que la saisie ne dépasse pas cette limite, faire quelque chose si c'est le cas, et purger le flux stdin.
Par exemple avec scanf et un spécificateur de taille
#include <stdio.h> int main(void) { char x[255]; char c; printf("Veuillez saisir une chaîne de 254 caractères " "au plus.\n"); if (scanf("%254[^\n]",x) == 1) { printf("J'ai récupéré : [%s]\n", x); if (getchar() != '\n') { printf("Erreur : je n'ai pas pu tout récupérer" "car votre saisie est trop longue\n"); while ((c = getchar()) != '\n' && c != EOF) /* purger le flux si le programme doit continuer*/ ; return 1; /* dans cet exemple, je termine */ } } return 0; }
tu dois inclurestring.h
quand ton code a besoin d'appeler une fonction dont le prototype est déclaré dansstring.h
(par exemplestrlen()
)
http://www.cplusplus.com/reference/cstring/
ou le typesize_t
ou la macroNULL
, qui sont aussi définis dans cet entête.
Dal
-