Lire des caractere speciaux dans un fichier

Résolu
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011 - 10 mai 2007 à 12:03
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 10 mai 2007 à 15:26
bonjours tout le monde

je suis face a un probleme de taille.
En effet je cherche a lire dans un fichier txt certain caractere comme par exemple les tabulations et les espaces. Je n'ai aucune idée de comment faire.

Le but de mon programme est de passer d'un fichier de coordonné séparé par des espace vers un fichier de coordonné séparé par des tabulation et vice et versa

merci d'avance a toute personne essayant de m'aider

17 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
10 mai 2007 à 12:31
Il suffit de proceder de la maniere suivante
tu parcours la premiere chaine, si tu tombe sur un caracteres norma tu l'ecris dans la deuxieme. si c'est un espace, tu ecrit une tabultation dans la deuxieme fait et tu met une varaible a une certaine valeur, tant que tu est sur des espaces et que la variable vaut la valeur tu n ecris pas dans la deuxieme chaine. quand tu retombe sur un caractere normal tu rechange la valeur de la variable drapau" et tu réecrit les caracteres.
bon je ne sais pas si c'est clair, mais bon :)
3
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 14:49
j'ai trouver le probleme.
c'est une erreur d'algorithmique, il me fallait juste un autre indice de parcour pour le tableau tabRes.
J'ai par la meme occasion modifier le while qui est devenu:
    while(fgets(tabCh,512,falire)!=NULL)
merci a laurent1024 pour tes conseils
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
10 mai 2007 à 12:16
tu lit ton fichier avec des write => tu recupere des tableau de caracteres, tu parcours le tableau tu remplace les " " par "\t" et tu enregistre le trableau dans un autre fichier
0
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 12:26
je comprend ton idée mais le probleme est que dans le tableau je peux me retrouvé avec plusieur espace a la suite, or je veut qu'une tabulation pour les remplacer tous, ce qui rend le traitment avec des tableau plus complexe. J'attend donc d'autre idée.

merci quand meme
0

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

Posez votre question
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 12:36
pour tester si le caractere correspond a un espace je peut faire:
    if (tabChaine[n]==" ")
       ...

ou pas ...
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
10 mai 2007 à 12:39
oui si tab chaine du type char tabChaine[X] ou char * tabChaine; (avec un initialisation avec malloc quelque part avant) et que n est bien un indice du tableau.
0
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 12:42
oki merci

et pour faire le contraire (passer d'une tabulation a des espaces) la logique est la meme??
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
10 mai 2007 à 12:45
Oui. C'est le meme principe. Car en fait " " est "\t" sont des caracteres comme les autres du point de vu asscii. Tu peut travailler avec eux comme si c'etait le caractere A ou  z.
0
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 12:47
oki merci pour tout je vous tien au courrant du resultats
0
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 13:45
j avance mais je me retrouve face a un autre probleme:

voila le code que j'ai produit:

int main ()
{
FILE *falire, *fcorr;               
    unsigned char cach, cmod;
    unsigned char tmp;
    int i=0, espace=0, lgTab;
    char *nomFic="", *nomFic_corr="";
    char *tabCh, *tabRes;

... (des truc qui ne vous interrese pas)...

tabCh=malloc(256*sizeof(char));
               tabRes=malloc(256*sizeof(char));
               fgets(tabCh,sizeof(tabCh),falire);
               while(!feof(falire))
               {
                    lgTab=strlen(tabCh);
                    for(i=0;i<lgTab;i++)
                    {
                          if(tabCh[i]==' ')
                          {
                                if(espace==0)
                                {        
                                    tabRes[i]='\t';
                                    espace=1;
                                }
                          }
                          else
                          {
                              tabRes[i]=tabCh[i];   
                              espace=0;
                          }                                            
                    }
                    fputs(tabRes,fcorr);
                    fgets(tabCh,sizeof(tabCh),falire);
               }
}

mon fichier en entré est du type:
2.3  4,5 6.7  8,9
1.3  2,4 5.7  6,8

et le resultat obtenu est:
2.3     .4,5    6.7    .8,9
1.3    .2,4    5.7    .6

bilan: quand il y a 2 espaces entre 2 valeurs les tabulation sont de taille 5 et non de 4 comme les autre puis il me rajoute aussi des '.' la ou il y a deux espace

autant dire que j'ai du mal a trouver la logique de cette execution

please, help me
0
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 14:03
afin de tester il faut ajouter aprés la declaration des variables:

//ouverture du fichier a modifier
    printf("\nenter the name of the input file (with extension):");
    nomFic=malloc(256*sizeof(char));
    scanf("%s",nomFic);
    falire=fopen(nomFic,"r");
    if (falire==NULL)
    {
        printf("error %s: file not found\n",nomFic);
        system("PAUSE");
        exit(0);
    }
   
    printf("enter the name to create the output file: ");
    nomFic_corr=malloc(256*sizeof(char));
    scanf("%s",nomFic_corr);   
    //ouverture du fichier de sortie
    fcorr=fopen(nomFic_corr,"w");
    if (fcorr==NULL)
    {
        printf("\nerror: cannot create the result file\n");
        system("PAUSE");
        exit(0);
    }
   
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
10 mai 2007 à 14:52
le problème est certainement dû au fait que tu utilises la même variable pour parcourir le tableau source et le tableau destination
en effet, lorsque plusieurs espaces se succèdent, tu ne mets pas de valeur dans ton tableau destination et pourtant tu décales ton pointeur. il y a donc des valeurs non enregistrées, qui sont certainement tes points...

tu dois utiliser une autre variable pour ton tableau destination que tu n'incrémentes que lorsque tu entres une valeur, sans te préoccuper de la position du pointeur sur ton tableau source.

je sais pas si c'est bien clair tout ça lol.

Loki
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
10 mai 2007 à 14:53
oups lol mon post est obsolète désolé si quelqu'un peut le virer...

Loki
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mai 2007 à 15:16
Pas le temps de tester mais devrait aller:

// RETOURNERA LE NBR D'OCTETS RESULTANT
// SUBSTITUTION SUR PLACE
int __stdcall SpacesToTab(char *psrc, unsigned int len)
{  char *c psrc, *d psrc;
  if(!len) return 0;
fromSRC:
  while(*c != ' ') {
    *d++ = *c++;
    if(--len = 0) goto tabEXIT;
  }
  *d++ = '\t';
  do {
    if(--len = 0) goto tabEXIT;
  } while(*++c == ' ');
  goto fromSRC;
tabEXIT:
  return (d - psrc);
]

ciao...
BruNews, MVP VC++
0
krusty24 Messages postés 19 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 15 novembre 2011
10 mai 2007 à 15:20
heu... ouai

je vois pas trop a koi sa me sert. Qui plus est j'ai regler le probleme.
Si tu me donne un peu plus d'info peut-etre je vais l'utiliser.

merci quand meme
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
10 mai 2007 à 15:24
Il n'y aurait pas une erreur dans ton code BruNews "if(--len = 0)", ca me parait bizarre, mais j'ose quand meme poser la question
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mai 2007 à 15:26
ah oui, taper direct dans cet éditeur, dur dur...
bien entendu.

krusty24 > marqué au dessus de la fonction ce que ça fait, me semblait que c'est ce que tu voulais.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous