Création d'un fichier avec C

Fermé
hamajemai - Modifié le 10 déc. 2018 à 10:03
hamajemai Messages postés 4 Date d'inscription dimanche 9 décembre 2018 Statut Membre Dernière intervention 10 décembre 2018 - 10 déc. 2018 à 20:32
Bonjour,
Mon programme crée un fichier vide mais il n'écrit rien dans ce fichier, je comprend pas où est le problème, aide moi s'ils vous plaît.
Et merci d'avance.
Le programme :
#include <stdio.h>
#include <string.h>
main()
{FILE *noeud;
char t[13];
int i;
 t[0]="nombre des noueds";
 t[1]="10";
 t[2]="precedances";
 t[3]="1 2";
 t[4]="1 6";
 t[5]="2 7";
 t[6]="2 5";
 t[7]="3 6";
 t[8]="4 8";
 t[9]="5 9";
 t[10]="6 10";
 t[11]="7 10";
 t[12]="8 10";
 noeud=fopen("data.txt", "w");
 for(i=0;i<13;i++)
 {fprintf(noeud,"%s\n",t[i]);}
 fclose(noeud);
 noeud=fopen("data.txt","r");
 i=0;
 while(1)
 {fscanf(noeud,"%s\n",t[i]);
 if(feof(noeud))
  break;
 printf("%s\n",t[i]);
 i++;
  
 }
 fclose(noeud);
 return 0;


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 10 déc. 2018 à 10:01
Salut hamajemai,

Une chaîne, en C, est une suite de char terminés par le caractère
'\0'
.

Donc, un tableau de char tel que
char s[13];
permet seulement de stocker une chaîne de 12 caractères au plus (12 plus
'\0'
). Par exemple
char s[13] = "Bienveillant";
. Si tu fais
s[2]
sur un tel type, tu accèdes au 3ème caractère accessible sur cet espace mémoire, c'est tout.

Si tu veux déclarer un tableau de chaînes de caractères, il te faut donc déclarer un tableau dont chaque indice permet d'accéder, non pas à un seul char, mais à un espace mémoire permettant de stocker les chaînes que tu veux y mettre.

Tu peux faire cela de deux façons : tu déclares un tableau à 2 dimensions de char, avec une 2ème dimension ajustée à la longueur maximale des chaînes + 1, ou tu déclares un tableau de pointeurs sur char pointant chacun sur un espace mémoire permettant d'y stocker chaque chaîne.


Dal
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 10 déc. 2018 à 14:06
Il y a d'autres problèmes ensuite...

Tu devras aussi corriger l'affectation de chaînes.

Tu ne peux pas faire d'affectation avec le signe
=
en dehors de l'initialisation lors de la déclaration.

Pour affecter une chaîne à un tableau de char dans ton code après déclaration, il faut utiliser
strcpy()
ou
strncpy()
.

Par exemple :
  char t[13][20] = { '\0' };
 
  strncpy(t[0], "nombre des noueds", 19);
  strncpy(t[1], "10", 19);
  strncpy(t[2], "precedances", 19);
(...)

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

En initialisant lors de la déclaration, c'est moins compliqué. Par exemple :

    char t[13][20] = {
        "nombre des noueds",
        "10",
        "precedances",
        "1 2",
        "1 6",
        "2 7",
        "2 5",
        "3 6",
        "4 8",
        "5 9",
        "6 10",
        "7 10",
        "8 10"                                                                                                                                                                                                     
    };

Pour la lecture du fichier, si tu utilises
fscanf()
avec
%s
, ta lecture va s'arrêter au premier espace rencontré.

cf. http://www.cplusplus.com/reference/cstdio/fscanf/

s String of characters Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.

Tu ne pourras donc pas lire efficacement une ligne comme
"1 2"
de cette façon.

Si tu veux utiliser
fscanf()
pour lire une ligne, dans la limite d'un certain nombre de caractères, il te faut un autre spécificateur. Dans ton cas par exemple :
"%19[^\n]"
. Cela va lire 19 caractères au plus en prenant tous les caractères et en s'arrêtant au premier
'\n'
rencontré et en ajoutant le
'\0'
de fin. Note que
scanf()
fonctionne de la même façon. Du coup
'\n'
restera dans le flux et tu devras le consommer aussi. Au final, cela donnerait quelque chose comme :

    while (fscanf(noeud, "%19[^\n]", t[i]) == 1) {
        int c;
        printf("%s\n",t[i]);
        i++;
        while ((c = fgetc(noeud)) != '\n' && c != EOF)                                                                                                                                                             
            /* purger la fin de ligne */ ;
    }

(au lieu de ta boucle
while(1)
)

Alternativement, beaucoup de personnes préfèrent utiliser
fgets()
qui est conçue pour lire des lignes, et qui gère, en tant que paramètre, la limitation du nombre caractères à lire. Elle a ses propres difficultés, notamment le fait qu'elle lit aussi le
'\n'
de fin de ligne.

http://www.cplusplus.com/reference/cstdio/fgets/

Tu devrais aussi remettre à zéro ta mémoire entre l'écriture et la lecture, avec
memset()
.

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

Tu as toutes les infos pour corriger ton code.

Si tu n'arrives pas à corriger ton code avec ces indications, poste ton code avec tes corrections et décrit ton problème.

Comme indiqué en fin de ton message initial par le modérateur (qui a modifié ton post initial pour formater correctement ton code), lorsque tu postes ton code sur le forum, fais le entre balises de code. Comme cela :

<code c>
Ton code ici
</code>
(ou en cliquant sur le menu des balises de code)

Cela présentera le code sur le forum en préservant l'indentation, en numérotant les lignes et avec coloration syntaxique.

Dal
0
hamajemai Messages postés 4 Date d'inscription dimanche 9 décembre 2018 Statut Membre Dernière intervention 10 décembre 2018
10 déc. 2018 à 20:32
Merci beaucoup .
0
Skynoze Messages postés 344 Date d'inscription dimanche 18 décembre 2016 Statut Membre Dernière intervention 12 février 2019 222
9 déc. 2018 à 13:54
int main() {
// create a FILE typed pointer
FILE *file_pointer;

file_pointer = fopen("nom_du_fichier.txt", "w");

// Write to the file
fprintf(file_pointer, "Laisse vide si tu veut riens dedant ou du texte");

// Close the file
fclose(file_pointer);
return 0;
}
0
hamajemai Messages postés 4 Date d'inscription dimanche 9 décembre 2018 Statut Membre Dernière intervention 10 décembre 2018
9 déc. 2018 à 14:03
Merci, mais je fait exactement ça mais le fichier reste vide!!!
0
Skynoze Messages postés 344 Date d'inscription dimanche 18 décembre 2016 Statut Membre Dernière intervention 12 février 2019 222
9 déc. 2018 à 14:05
Ah ! Tu utilise ftp pour héberger le fichier ?
0
hamajemai Messages postés 4 Date d'inscription dimanche 9 décembre 2018 Statut Membre Dernière intervention 10 décembre 2018
9 déc. 2018 à 14:07
Excusez moi , je suis débutant en programmation, c'est quoi le ''ftp'' exactement
0
Skynoze Messages postés 344 Date d'inscription dimanche 18 décembre 2016 Statut Membre Dernière intervention 12 février 2019 222
9 déc. 2018 à 14:09
Tu héberge ton "serveur" en local ou sur un serveur internet que tu a acheté ?
0
hamajemai Messages postés 4 Date d'inscription dimanche 9 décembre 2018 Statut Membre Dernière intervention 10 décembre 2018
9 déc. 2018 à 14:21
Local
0