Création d'un fichier avec C
hamajemai
-
hamajemai Messages postés 4 Statut Membre -
hamajemai Messages postés 4 Statut Membre -
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 :
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. |
2 réponses
-
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 quechar s[13];
permet seulement de stocker une chaîne de 12 caractères au plus (12 plus'\0'
). Par exemplechar s[13] = "Bienveillant";
. Si tu faiss[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-
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 utiliserstrcpy()
oustrncpy()
.
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 utilisesfscanf()
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 utiliserfscanf()
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 quescanf()
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 bouclewhile(1)
)
Alternativement, beaucoup de personnes préfèrent utiliserfgets()
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, avecmemset()
.
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 -
-
-
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;
}