Création d'un fichier avec C

hamajemai -  
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 :
#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

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
    2. hamajemai Messages postés 4 Statut Membre
       
      Merci beaucoup .
      0
  2. Skynoze Messages postés 349 Date d'inscription   Statut Membre Dernière intervention   222
     
    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
    1. hamajemai Messages postés 4 Statut Membre
       
      Merci, mais je fait exactement ça mais le fichier reste vide!!!
      0
    2. Skynoze Messages postés 349 Date d'inscription   Statut Membre Dernière intervention   222
       
      Ah ! Tu utilise ftp pour héberger le fichier ?
      0
    3. hamajemai Messages postés 4 Statut Membre
       
      Excusez moi , je suis débutant en programmation, c'est quoi le ''ftp'' exactement
      0
    4. Skynoze Messages postés 349 Date d'inscription   Statut Membre Dernière intervention   222
       
      Tu héberge ton "serveur" en local ou sur un serveur internet que tu a acheté ?
      0
    5. hamajemai Messages postés 4 Statut Membre
       
      Local
      0