Créé un fichier txt en c

Fermé
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 - 10 nov. 2009 à 23:04
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 16 nov. 2009 à 13:49
Bonjour,
Je voudrais juste savoir comment créé un fichier fichier.txt avec un petit programme en c, le plus simple possible, j'ai déjà chercher sur plusieurs forum mais la plupart explique comment ouvrir un fichier, mais je veux le créé. L'ouverture je verrais plus tard.
Merci d'avance
A voir également:

15 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
10 nov. 2009 à 23:18
Salut,

Voici le minimum pour la création ;-))).
#include <stdio.h>

int main(void) {
  FILE *fp=fopen("nouveau.txt","w");
  if (fp==NULL) {
     fputs("erreur de création\n",stderr);
     return 1;
  }
  puts("fichier créé");
  return 0;
}
1
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
11 nov. 2009 à 00:12
Merci pour cette reponse rapide, j'ai une autre question

Mon fichier aura un certain nombre de caracter par ligne, ce nombre sera toujour supperieur a 20, mais moi je veux recuperer les 20 premier caractere de chaque ligne.
J'arrive a recuperer la premiere ligne mais pas les suivantes, J'ai utiliser ce code :
{
char ligne[20];
FILE *fp = fopen ("data.txt", "r");
if (fp != NULL)
{
fgets (ligne, sizeof ligne, fp);
printf ("1: %s\n", ligne);
}
fclose (fp);
}
else
printf ("Erreur d'ouverture du fichier\n");
return 0;
}

Dans la console cela affiche bien les 20 premier caractere de ma premiere ligne de mon fichier, mais comment proseder pour affichier les 20 premier caractere de la seconde ligne ?

Merci d'avance !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 nov. 2009 à 16:26
Ah, je vois mieux ce que tu veux faire.
Ceci devrait répondre à tes besoins.
Par contre, je te conseille vivement l'utilisation de fonctions pour augmenter la lisibilité du code ;-))).
#include <stdio.h>

int main(void) {
  FILE *fp;

  fp=fopen("data.txt","r");
  if (fp==NULL) {
     fputs("erreur d'ouverture\n",stderr);
     return 1;
  } else {
      int i=0;
      char buffer[5][21];

      while(i<5 && fgets(buffer[i],sizeof buffer[i],fp)!=NULL) {
          int c;
          char *p;
          if ((p=strchr(buffer[i],'\n'))!=NULL)
              *p=0;
          else
              while((c=fgetc(fp))!='\n' && c!=EOF);
          i++;
      }

      fclose(fp),fp=NULL;
      
      for (i=0;i<5;i++)
        puts(buffer[i]);

  }
  return 0;
}
1
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
11 nov. 2009 à 00:37
Si on veut réitérer jusqu'à la fin du fichier, il faudra faire une boucle du genre:
int compteur = 0;
...
if (fp)
{
  while (fgets (ligne, sizeof ligne, fp))
    printf ("%d: %s\n", ++compteur, ligne);
  fclose (fp);
}
...
Si je n'ai pas fait d'erreur(s), cela devrait fonctionner.
Bonne continuation.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 nov. 2009 à 02:49
Attention, pour afficher 20 caractères, il faut un buffer de 21.
Pour afficher les 20 premiers caractères, l'astuce consiste à attendre la fin de ligne '\n' avec des fgetc et redémarrer une lecture du flux avec fgets.
Attention également à bien mettre ton fclose si fp!=NULL sinon le comportement sera indéfini.
Ce qui donne :
#include <stdio.h>

int main(void) {
  FILE *fp;
  
  fp=fopen("data.txt","r");
  if (fp==NULL) {
     fputs("erreur d'ouverture\n",stderr);
     return 1;
  } else {
      char buffer[21];
      
      while(fgets(buffer,sizeof buffer,fp)!=NULL) {
          int c;

          puts(buffer);
          while((c=fgetc(fp))!='\n' && c=EOF);
      }

      fclose(fp),fp=NULL;
  }
  return 0;
}

Cdlt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
11 nov. 2009 à 10:33
Merci mais je ne comprend pas trop cette ligne la:
while((c=fgetc(fp))!='\n' && c=EOF);
il y a un while mais rien en dessus.. donc moi cela signifie "si..quelquechose... et dans les accolade du dessou.. alors fais ca" sauf qu'il y a pas d'instruction en dessous.
Et lorsque je compile j'ai une erreur :
"lvalue required as left operand of assignement"
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 nov. 2009 à 13:03
J'ai oublié de mettre le point d'exclamation ^^.
Il s'agit plutôt de : while((c=fgetc(fp))!='\n' && c!=EOF);
Cette ligne-là signifie lit les caractères du fichier jusqu'à la fin de la ligne ('\n') ou la fin du fichier (si dernière ligne).
Ainsi lorsque tu referas un fgets, tu seras sur la ligne suivante, te permettant de reprendre à nouveau les vingt premiers caractères. Si tu enlèves cette ligne, t'auras des problèmes pour des lignes possédant plus de 20 caractères, puisque lors du second fgets les 20 caractères suivants de la ligne seront affichés.

Cdlt
0
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
11 nov. 2009 à 16:10
Hum.. ce code m'affiche quelque chose de bizarre.. un '9' , qui est le dernier caractere de ma 5 ème et dernière ligne..
Enfet je me suis peux etre mal expliquer, ce que je veux faire c'est recuperer dans des
char ligne1[20]
char ligne2[20]
char ligne3[20]
char ligne4[20]
char ligne5[20]
Je voudrais donc récupérer les 20 premiers caractères des 5 premières lignes (première et seul, il y aura pas plus de ligne dans le fichier), donc récupérer ceci dans 5 variable (char) différentes. Pour que je puisse les utiliser séparément par la suite en fessant par exemple appel a ligne3...
0
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
11 nov. 2009 à 17:51
Merci pour ce code c'est exactement ce qu'il me fallait, par contre encore un petit souci comme d'habitude, le char buffer[5][21] je l'ai sorti de la fonction et je l'ai mis dans ma structure pour pouvoir utiliser ses ligne récupérer dans chacune de mes fonction.
Dans mon main je fais appel a la fonction "recup" qui est justement le code du dessus, a la fin de la fonction recup il y a un for qui nous affiche les 5 ligne récupérer, et cela marche super bien les 5 ligne apparaissent dans la console.
Dans mon main, juste en dessous de la fonction "recup" j'ai voulu faire une fonction "affiche" j'y ai tout simplement coller les 2 ligne de "for" avec le puts, juste indiquer qu'il s'agit de variable d'une structure donc avec la flèche "->". Et la.. très très étrange, il m'affiche une première ligne vide, et m'affiche bien les 4 suivante comme il faut.

Étrange car dans la fonction du dessus il m'affiche les 5 comme il faut. Je ne vois absolument pas d'où peux venir ce problème bizarre j'ai tout simplement passer d'une fonction a l'autre..
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 nov. 2009 à 19:33
Poste ton code, ce sera plus simple pour t'aider ;-))).
PS : n'oublie pas de poster entre deux balises de conservation du texte (à droite du bouton souligné).
0
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
11 nov. 2009 à 22:00
Désolé de vous embêter ainsi, j'ai réussi a résoudre le problème après quelque heures de recherche.
Je continue mon projet, je reviendrais en cas de problème, merci d'avance pour toutes ces aides!
0
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
12 nov. 2009 à 08:36
Bon voila je reviens a vous, j'ai pas mal avancer mais encore un problème me viens.
Chacune des 5 lignes de mon fichier aura entre 21 et 26 caractères, on ne peu pas le savoir a l'avance quel ligne aura combien. J'ai déjà récupérer les 20 premiers caractères de chaque ligne dans 5 char différents.
Maintenant je voudrais récupérer dans 5 char différents le reste de ses ligne, donc a partir du 21eme caractère jusqu'au \n, enfin le \n j'en ai pas besoin, juste devant. Donc chacun de ses char aura entre 1 et 6 caractères environ.
Comment les récupérer ??
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
12 nov. 2009 à 19:33
Salut,
Si tu as compris la logique du programme, tu devrais t'en sortir, c'est pareil.
En gros, dans la condition qui teste la présence du '\n' tu rajoutes, un fgets... et tu supprimes le \n si détecté.
Les tableaux de char auront la forme : char reste[5][8].

Poste le code qu'on puisse te corriger si ça marche pas ;-))).
0
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
13 nov. 2009 à 08:35
Mais en fait mon plus gros souci ce n'est pas de supprimer le \n de la fin, c'est surtout comment commencer a prendre le texte a partir du 21 caractères?
Car dans le code précédant pour prendre les 20 premiers caractères on indique pas qu'on l'on prend a partir du premier...? Ça se fis automatiquement.
0
Halicard Messages postés 79 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 18 juin 2015 3
16 nov. 2009 à 13:35
Bon en fait c'est bon j'ai réussi a le faire.
Dernier truc et le projet est fini, comment toujours en c, supprimer le contenue d'un fichier texte pour pouvoir ré-écrire par dessus ?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
16 nov. 2009 à 13:49
Le simple fait d'écrire:
FILE *fp=fopen("nouveau.txt","w"); écrase ton fichier, sa taille étant ramené à zéro à cause du 'w', ce qui n'est pas le cas avec 'r' ou 'a'.
Bonne continuation.
0