Lire dans un fichier en C

Fermé
momoadmo Messages postés 6 Date d'inscription jeudi 1 juin 2017 Statut Membre Dernière intervention 2 juin 2017 - Modifié le 1 juin 2017 à 15:13
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 2 juin 2017 à 12:01
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 mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
Modifié le 1 juin 2017 à 15:43
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 mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
1 juin 2017 à 15:47
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 1 juin 2017 à 19:49
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 mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
2 juin 2017 à 09:50
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 2 juin 2017 à 12:25
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