Lire des caractere speciaux dans un fichier [Résolu]

Signaler
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
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 :)
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

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
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
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
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

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
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

pour tester si le caractere correspond a un espace je peut faire:
    if (tabChaine[n]==" ")
       ...

ou pas ...
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
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.
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

oki merci

et pour faire le contraire (passer d'une tabulation a des espaces) la logique est la meme??
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
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.
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

oki merci pour tout je vous tien au courrant du resultats
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

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
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

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);
    }
   
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
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
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
oups lol mon post est obsolète désolé si quelqu'un peut le virer...

Loki
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
19
Date d'inscription
vendredi 15 septembre 2006
Statut
Membre
Dernière intervention
15 novembre 2011

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
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++