Opération sur fichiers *.dat
2 participants
Page 1 sur 1
Opération sur fichiers *.dat
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:
Pas de problème en exécution:
D'où peut venir ce problème? Comment le résoudre?
Merci,
JTLG
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
Re: Opération sur fichiers *.dat
C'est un fichier texte ?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 relativement simple. Un traitement à la volée en mode binaire (brut) suffit.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.
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;
}
- 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;
}
Dernière édition par -ed- le Lun 27 Oct 2008 - 17:33, édité 3 fois
Re: Opération sur fichiers *.dat
Effectivement: après une vérification des argv[] et autres ça va beaucoup mieux:
Le résultat est bien celui escompté. Merci.
Je vais maintenant pouvoir m'attaquer au plus lourd.
- 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
Re: Opération sur fichiers *.dat
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...JTLG a écrit:Le résultat est bien celui escompté.
- 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;
Re: Opération sur fichiers *.dat
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.
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
Sujets similaires
» Bidouillage de fichiers.
» Protocole de transfert de fichiers en TCP/IP
» Fichiers & structures & String - Fonction de recherche
» Accept: socket operation on non-socket
» Protocole de transfert de fichiers en TCP/IP
» Fichiers & structures & String - Fonction de recherche
» Accept: socket operation on non-socket
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|