Lire dans un fichier en C

momoadmo Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 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.

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;
}
}
A voir également:

1 réponse

YCN- Messages postés 116 Date d'inscription   Statut Membre Dernière intervention   12
 
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.
0
YCN- Messages postés 116 Date d'inscription   Statut Membre Dernière intervention   12
 
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;
}
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
juste quelques observations :-)

si on n'alloue pas de mémoire pour le pointeur
x
, il ne va rien arriver de bon quand
scanf()
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 est
int main(void)


sur le forum, la balise de code correcte pour la coloration syntaxique du C est :

<code c>

code ici

</code>


Dal
0
YCN- Messages postés 116 Date d'inscription   Statut Membre Dernière intervention   12
 
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-
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 inclure
string.h
quand ton code a besoin d'appeler une fonction dont le prototype est déclaré dans
string.h
(par exemple
strlen()
)

http://www.cplusplus.com/reference/cstring/

ou le type
size_t
ou la macro
NULL
, qui sont aussi définis dans cet entête.

Dal
0