Opération sur fichiers *.dat

Voir le sujet précédent Voir le sujet suivant Aller en bas

Opération sur fichiers *.dat

Message  JTLG le Lun 27 Oct 2008 - 15:30

Bonjour,

Je me tourne vers vous pour trouver quelques solutions.
Je souhaite créer en C un programme qui me permettra depuis un fichier de data entré en argument, créer un autre fichier data (dont le nom est également donné en argument).

Typiquement, les fichiers data d'entrée sont composés de colonnes d'entiers, avec une virgule en place d'un point, et séparées par une tabulation.

Le data de sortie doit simplement (dans un premier temps) reprendre le tout, en remplaçant les virgules par des points, et les tab par des espaces.
En gros faire du find/replace automatique.

J'ai beaucoup cherché. J'ai repris mes anciens codes de traitement d'image. Mais là je bloque.
Lorsque je traite ça avec un pointeur qui lit caractère après caractère, j'obtiens du segmentation fault. quand je veux récupérer ligne par ligne, j'obtiens 'ELF'.

J'ai tenté de recommencer sur un exemple simple: j'ai un data avec une ligne comportant un entier. Que je veux recopier sur le data de sortie. mais toujours rien:


Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <sys/types.h>
#define max 20000

main(argc, argv)
int    argc;
char    *argv[];
{
FILE *fe, * fs;
int i, col, lig, k, j, n;
uint8 chaine[max];
int lu;
col=0; lig=0; i=0; n=0; k=0;

for(i=0;i<max;i++) chaine[i]=0;
fe=fopen(argv[0],"r");
fs=fopen(argv[1],"w+");
while(fgets(chaine, max, fe) != NULL)
      {
      fputs(chaine,fs);
      lig++;
      }
   printf("le fichier comporte %d lignes\n", lig);

   // fermeture du fichier
   if(fclose(fe) == EOF)
      {
      printf("Probleme de fermeture du fichier");
      exit(1);
      }

   printf(".............. Fermeture du fichier\n");

   return 0;
fclose(fs);
}

Pas de problème en exécution:

[jtlg@localhost Spectro]$ ./export test1.dat test.dat
le fichier comporte 8 lignes
.............. Fermeture du fichier

Contenu de test.dat: 12
Contenu de test1.dat: ELF
(quelque soit le contenu de test.dat)

D'où peut venir ce problème? Comment le résoudre?
Merci,
JTLG

JTLG

Messages : 3
Date d'inscription : 27/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Opération sur fichiers *.dat

Message  -ed- le Lun 27 Oct 2008 - 15:50

JTLG a écrit:
Je souhaite créer en C un programme qui me permettra depuis un fichier de data entré en argument, créer un autre fichier data (dont le nom est également donné en argument).

Typiquement, les fichiers data d'entrée sont composés de colonnes d'entiers, avec une virgule en place d'un point, et séparées par une tabulation.
C'est un fichier texte ?

Le data de sortie doit simplement (dans un premier temps) reprendre le tout, en remplaçant les virgules par des points, et les tab par des espaces.
C'est relativement simple. Un traitement à la volée en mode binaire (brut) suffit.

J'ai tenté de recommencer sur un exemple simple: j'ai un data avec une ligne comportant un entier. Que je veux recopier sur le data de sortie. mais toujours rie

  • Ton code utilise un codage des paramètres obsolète depuis 1989...
  • main() retourne un int explicite.
  • argv[0] n'est pas le premier paramètre. C'est argv[1].
  • l'ouverture des fichiers peut échouer. Il faut tester les valeurs retournées avant usage.
  • le mode d'ouverture d'un fichier texte en écriture est "w" et non "w+"
  • les instructions placées après return ne sont pas exécutées.
  • des variables non utilisées

Ceci devrait fonctionner :
Code:
#include <stdio.h>

#define max 20000

int main (int argc, char *argv[])
{
  if (argc > 2)
  {
      FILE *fe = fopen (argv[1], "r");
      if (fe != NULL)
      {
        FILE *fs = fopen (argv[2], "w");
        if (fs != NULL)
        {

            char chaine[max];
            int lig = 0;
            while (fgets (chaine, max, fe) != NULL)
            {
              fputs (chaine, fs);
              lig++;
            }
            printf ("le fichier comporte %d lignes\n", lig);

            /* fermeture du fichier */
            fclose (fs);
        }
        else
        {
            perror (argv[2]);
        }
        fclose (fe);
      }
      else
      {
        perror (argv[1]);
      }
  }
  else
  {
      puts ("usage : monappli source destination");
  }
  return 0;
}
Mais je conseille plutôt ceci :
Code:

#include <stdio.h>

#define max 20000

int main (int argc, char *argv[])
{
  if (argc > 2)
  {
      FILE *fe = fopen (argv[1], "rb");
      if (fe != NULL)
      {
        FILE *fs = fopen (argv[2], "wb");
        if (fs != NULL)
        {

            int c;
            while ((c = fgetc (fe)) != EOF)
            {
              switch (c)
              {
              case '.':
                  /* a completer */
                  break;
              case '\t':
                  /* a completer */
                  break;
              default:
                  fputc (c, fs);
              }
            }
            /* fermeture du fichier */
            fclose (fs);
        }
        else
        {
            perror (argv[2]);
        }
        fclose (fe);
      }
      else
      {
        perror (argv[1]);
      }
  }
  else
  {
      puts ("usage : monappli source destination");
  }
  return 0;
}
que je te laisse compléter.


Dernière édition par -ed- le Lun 27 Oct 2008 - 17:33, édité 3 fois

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Opération sur fichiers *.dat

Message  JTLG le Lun 27 Oct 2008 - 17:00

Effectivement: après une vérification des argv[] et autres ça va beaucoup mieux:

Code:

/***********************************************/
/*Ouverture des fichiers d'entrée et de sortie!*/
/***********************************************/

fe=fopen(argv[1],"r");
fs=fopen(argv[2],"w");

/***************************************/
/*Test d'erreur sur le fichier d'entrée*/
/***************************************/

if(fe==NULL)
   {
   printf("Error: can't open file.\n");
   }

else printf("File opened successfully.\n");


/**************************************/
/*Lecture et récupération des données.*/
/**************************************/

printf("Récupération des données.");
while((lu=getc(fe))!=EOF)
   {
   if (lu==',') {*p++='.';}
   else if (lu=='   ') {*p++=' ';}
   else if (lu=='\n') {lig++; *p++=(char)lu;}
   else *p++=(char)lu;
   k++;
   }
 *p='\0';

fputs(chaine, fs);

printf("le fichier comporte %d lignes et %d caractères\n", lig, k);

Le résultat est bien celui escompté. Merci.
Je vais maintenant pouvoir m'attaquer au plus lourd.

JTLG

Messages : 3
Date d'inscription : 27/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Opération sur fichiers *.dat

Message  -ed- le Lun 27 Oct 2008 - 17:22

JTLG a écrit:
Code:

while((lu=getc(fe))!=EOF)
   {
   if (lu==',') {*p++='.';}
   else if (lu=='   ') {*p++=' ';}
   else if (lu=='\n') {lig++; *p++=(char)lu;}
   else *p++=(char)lu;
Le résultat est bien celui escompté.
Il n'est pas utile de stocker la chaine (risque de débordement). Regarde ma proposition au-dessus. Et le caractère 'TAB', c'est '\t' et pas autre chose...

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Opération sur fichiers *.dat

Message  JTLG le Lun 27 Oct 2008 - 17:30

D'accord pour les switchs.
Oui, certaines variables ne sont pas utilisées pour le moment, mais seront utiles pour la suite du prog.
Merci beaucoup.

JTLG

Messages : 3
Date d'inscription : 27/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Opération sur fichiers *.dat

Message  Contenu sponsorisé Aujourd'hui à 21:19


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum