Boucle fopen

Résolu
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012 - 18 juil. 2010 à 18:49
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 20 juil. 2010 à 00:32
Bonjour, j'aurai aime savoir comment faire un boucle de fopen. Voila pour l'instant ce que j'ai
FILE* fichier = NULL; // nombre de points

    fichier = fopen("C:\\Documents and Settings\\....\\nombreDePointsPoisson001.txt","r");

    if (fichier != NULL)
    {
        fscanf(fichier, "%d", &nombreDePoints);
        printf("Il y a %d points\n\n", nombreDePoints);

        fclose(fichier);
        fichier = NULL;
    }
    else
    {
        printf("Il n'y a pas de point dans le processus.\n\n");
    }


J'ai d'autres boucles fopen sur le meme principe qui ouvrent d'autres fichiers.
Ensuite je fais toute une serie de calculs.
Je voudrait faire une boucle, mes parametres changeant, tous les fopen que j'ai dans le programme ouvrent des fichiers qui ont des valeurs qui changent a chaque fois. Par simplicite, j'ai appele chaque groupe avec un numero different, j ai donc par exemple "nombre001.txt" "coordonnees001.txt" et ainsi de suite, qui deviennent "nombre002.txt" "coordonnees002.txt"... J'aimerais change le 1 en 2 puis en 3 et ainsi de suite pour faire mes calculs pour chaque donnee.
Merci d'avance.
A voir également:

10 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 juil. 2010 à 00:07
Dans l'ordre je pense que le plus rapide:
- Solution 1 avec les modulo
- Solution avec les sprintf
- Ta solution

Si tu n'es pas sur du nombre de fichiers, la solution 2 avec sprintf est la plus pratique.

En revanche, je ne voit pas l'erreur avec le const ? fopen prend de toute façon une chaine const.
const char* filename "pouet"; ou const char filename[] "pouet";
fopen(filename, "r");

Fonctionne sans problème.

Bonne chance pour la suite ! N'hésite pas à faire part de tes avancées :)

________________________________________________________________________
Historique de mes créations, et quelques articles:[url= http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
19 juil. 2010 à 02:18
J'ai un peu progresse mais je n'y arrive toujours pas.
J'ai essaye avec itoa et strcat ceci
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int nombre=0, i=1;

    const char chaine1[]="C:\\Documents and Settings\\Qui qui quoi dont ou\\Plocha\\Memoire\\Processus de poisson, 1000 points, premier exemple\\nombreDePointsProcessusPoissonDehors00";
    const char chaine3[]=".txt";

    for(i=1;i<30;i++);
    {
    nombre=i;
    char chaine2[10]; // une chaine est un tableau de char, une chaine se finit toujours par \0
    itoa(nombre, chaine2, 10);
    printf("%d", chaine2[10]);

    strcat(chaine1,chaine2);

    strcat(chaine1,chaine3);

    printf("%s\n\n",chaine1);
    }
    return 0;
}



(Je n'ai pas defini la taille des chaines 1 et 3 mais je ne pense pas que cela soit important).
Deja, le print etant dans le for, j'aimerai qu'il affiche la chaine a chaque fois pour voir si ca ne fait pas de conneries, mais il l'affiche juste au dernier passage. A priori ca a l'air d'etre bon, mais defois entre ca a l'air et c'est il y a un monde.

Ensuite le probleme, c'est que bien que je sois capable d'ecrire mes adresses absolues en faisant defiler les chiffres grace a ma boucle, je ne sais pas les rentrer dans mon fopen. Comment j'indique a fopen ce que j'ai dans chaine1????
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 juil. 2010 à 10:03
Tu n'étais pas très loin de réussir, il te suffisait juste de faire une boucle avec "feof", qui permet de savoir si on est en fin de fichier ou non:
#include <stdio.h>

int main(void)
{
  FILE* fichier = NULL;
  int nombreDePoints;

  /* fichier = fopen("C:\\Documents and Settings\\....\\nombreDePointsPoisson001.txt", "r"); */
  fichier = fopen("test.txt", "r");

  if (fichier != NULL)
  {
    while (!feof(fichier))
    {
      fscanf(fichier, "%d", &nombreDePoints);
      printf("Il y a %d points\n\n", nombreDePoints);
    }

    fclose(fichier);
    fichier = NULL;
  }
  else
  {
    printf("Il n'y a pas de point dans le processus.\n\n");
  }

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
19 juil. 2010 à 13:51
Non, ce n'est pas ce que je cherche a faire. Je me suis peut etre mal exprime.

Quand je fais fopen, j'ouvre un document avec son adresse abslue. Peut importe ou il se trouve, la seule chose qui soit d'interet et que je l'ai nomme "blabla001.txt".
Une fois que j'ai recupere ce qu'il contient et fais ce que je voulais, je veux repeter l'operation pour ses petits freres, des dossiers contenant le meme type d'informations que j'ai nomme "blabla002.txt" jusqu'a "blabla00n.txt" Je veux faire une boucle pour ne pas avoir a rentrer le nom du fichier a chaque fois, j'en ai tellement que cela pendrait des heures.

Avec ce que j'ai fait hier avec itoa et strcat, j'arrive a faire des chaines qui reforment le nom, avec le numero. Disons que j'ai
char chaine1[]="blabla00"

puis aussi
char chaine3=".txt"
.

je me saire de itoa pour faire une boucle
nombre=i;
    char chaine2[10]; // une chaine est un tableau de char, une chaine se finit toujours par \0
    itoa(nombre, chaine2, 10);
. Donc quand ensuite je fais
strcat(chaine1,chaine2);

    strcat(chaine1,chaine3);

    printf("%s\n\n",chaine1);

je recupere "blabla001.txt" par exemple quand i =1.

Le probleme et que je ne sais pas comment chaine1 doit etre lu par fopen pour qu'il comprenne que c'est l'adresse absolue marquee.
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 juil. 2010 à 14:33
Ok, alors dans ce cas, 2 solutions:
- Scannez les dossiers: avec readdir (Linux) ou FindFirst/FindNext (Windows)
- Donnez une liste de fichier (solution sur laquelle tu sembles t'orienter)

Pour ton exemple, si tu es sur et certains que le nom de fichier ne changera pas (aura toujours la même taille).
Tu peux faire ceci:
#include <stdio.h>

int main(void)
{
  char filename[] = "blabla000.txt";
  int i = 0;

  for (i = 0; i < 1000; ++i)
  {
    filename[6] = '0' + i / 100;
    filename[7] = '0' + (i % 100) / 10;
    filename[8] = '0' + (i % 10);

    printf("%i %s\n", i, filename);
  }

  return 0;
}


Ou alors, à coup de sprintf:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char filename[1024];
  int i = 0;

  for (i = 0; i < 1000; ++i)
  {
    sprintf(filename, "blabla%i.txt", i);

    printf("%i %s\n", i, filename);
  }

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
19 juil. 2010 à 20:38
Merci, mais ce n'est pas encore tout a fait ca. La, on fait defiler les chiffres. C'est l'etape d'apres qui me pose probleme, l'utilisation de fopen. Celle-ci attend deux entrees, le nom du fichier et la facon dont on l'ouvre. Si j'ecris le chemin absolu, elle lit sans probleme.

Avec ce que l'on a ecrit, le chemin absolu se trouve dans un tableau de char, disons comme dans l'exemple filename[].
Mais autant je peux lui ecrire le chemin absolu autant je ne peux pas ecrire
fopen(filename,"r");

par exemple (fopen attend un pointeur, non). Moi je souhaite qu'elle comprenne que ce que je lui mets ce n'est ni plus ni moins que l'adresse absolue du fichier.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 juil. 2010 à 22:41
Heu... Dans mon exemple, tu peux sans problème lui donner filename.
Je te rapelle que filename[] est considéré comme un pointeur.

fopen(filename, "r"); est tout à fait *valable* !

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
19 juil. 2010 à 23:47
Ben la, je suis comme qui dirait sur le cul, devant ma stupidite.
En lisant ta reponse, je me suis dit: nom de Dieu ce n'est pas possible, il a raison, pourquoi ca ne marche toujours pas. Je suis retourne voir ce que j'avais ecrit de mon cote au debut avec itoa et strcat (mon deuxieme message) parce que je renvoyais aussi cela dans une liste nommee chaine1. Je relis et la je vois que comme un con j'avais fais une definition
const char chaine1[]=
.

Et la je dit: quel con, predre autant de temps parce que j'avais ecrit "const".

Neanmoins merci pour toutes les reponses, ce que tu as ecrit est nettement plus joli que ce que j'avais fait. J'aurais donc une ultime question: qu'est ce qui est le plus rapide entre mon "itoa+strcat", ta solution 1 en divison/modulo ou ta solution 2 "sprintf"? Apriori je pense que c'est at solution 1. Je dois faire 100 boucles de mon programme, et j'ai des "for" dedans avec des indices qui peuvent depasser les 1000, ca peut peut-etre avoir son importance.
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
20 juil. 2010 à 00:25
Ben ca compilait, mais la console renvoyait automatiquement un message d'erreur. Je pense que ca venait du fait que je faisais strcat dans la chaine alors que celle-ci avait ete declaree comme const. En tout cas en l'ayant enleve, cette methode fonctionnait aussi et sans renvoyer de message d'erreur.
Je suis quand meme passe a la methode modulo. Je suis toujours un peu fier de faire un truc qui marche, mais si on peu faire quelque chose qui marche mieux... je ne vais pas m'en priver.

Merci bien du coup de main, la je vais faire un test, au pire demain matin, on verra bien le resultat mais a priori il ne devrait pas y avoir de couac. Bonne soiree
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 juil. 2010 à 00:32
Ah ok, effectivement.
On ne peut pas faire de strcat sur une chaîne constante, tu as raison !

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous