Conversion de fichier texte dos/windows en fichier texte unix

Soyez le premier à donner votre avis sur cette source.

Vue 12 515 fois - Téléchargée 229 fois

Description

Ce code va transformer des fichiers ecrit sous dos/windows en fichier texte unix .
C-a-d enlever les caractères suplémentaires non pris en charge par unix.

Source / Exemple :


/*************************************************************/
/* UDL, facultee des sciences, departement d'informatique                        */
/* El Antri Abdellah                                                                                */
/* Email: el_emir_2002@yahoo.fr                                                            */
/* Compiler avec tc++ 3 sous dos et cc sous unix SunOs/linux                    */
/*************************************************************/
/*************************************************************/
/* Ce programme trnsforme un ficier texte ecrit sous dos ou                      */
/* windows en un fichier texte de format unix                                           */
/* ***********************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>

#ifdef _cplusplus
#include<io.h>
#include<dos.h>
#endif

void erreur_ouverture_fichier(char *nom_fichier, int err)
{
printf("\n Erreur d'ouvrir le fichier nome: %s",nom_fichier);
switch(err)
     {
     case ENOENT:printf("\n Chemin ou fichier introuvable.\n");break;
     case EMFILE:printf("\n Trop de fichiers ouverts.\n");break;
     case EACCES:printf("\n Acces refuse.\n");
     }
}

int main(int argc, char **argv)
{
char nom_fichier[100]  ;
FILE *ptr_nom_fichier  ;
FILE * ptr_fichier_temp;
char c                 ;

printf("\n*Ce prog transforme un fichier TXT sous dos/win au format unix.*\n");
if(argc == 1)
  {
  printf("\n Donner le nom de fichier:");
  scanf("%s",nom_fichier);
  }else if(argc == 2)
	  strcpy(nom_fichier,argv[1]);
             else 
	     {
		     printf("\n Trop de parametre.\n");
		     exit(1);
	     }
ptr_nom_fichier = fopen(nom_fichier,"r");
if(ptr_nom_fichier == NULL)
  {
  erreur_ouverture_fichier(nom_fichier,errno);
  exit(1);
  }
ptr_fichier_temp = fopen("temp","w+");
if(ptr_fichier_temp == NULL)
   {
   erreur_ouverture_fichier("fichier temporaire",errno);
   }
while(!feof(ptr_nom_fichier))
     { 
     c = getc(ptr_nom_fichier);
     if( c != 13 && c != EOF)
        fputc(c,ptr_fichier_temp);
     }
fclose(ptr_nom_fichier);
if(fseek(ptr_fichier_temp, 0, SEEK_SET)<0)
   { 
	printf("\nUne erreur est survenu.\n");
	exit(1);
   }
ptr_nom_fichier = fopen(nom_fichier,"w");
while(!feof(ptr_fichier_temp))
     {
     c = getc(ptr_fichier_temp);
     if(c != EOF)
        fputc(c,ptr_nom_fichier)  ;
     }
fclose(ptr_nom_fichier) ;
fclose(ptr_fichier_temp);
system("rm temp");
return 0;
}

Conclusion :


Le programme va chercher les caractères retour a la ligne(code ascii 13).

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
'probablement' tu peux le remplacer par enormement, dans un prog comme celui ci 98 % du temps se passe en acces disques donc reduction est (32 * 1024 FOIS), c'est pas rien.

*d++ = *c se decompose en:
*d = *c;
d++;
Le goto est une vieille habitude qui m'evite des indentations parfois qui n'en finissent plus avec des while, for... Dans tous les cas le compilo ecrira des goto (JMP en ASM) donc resultat est idem.

BruNews, Admin CS, MVP Visual C++
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

tu peux me rappeler si *d++ correspond à (*d)++ ou à *(d++) ? merci ^^
accessoirement, j'aurais utilisé une while plutôt qu'un système de goto, est-ce que le goto est, d'une manière oe d'une autre, plus rapide, ou est-ce que c'est une de tes habitudes de codage?

finalement, la seule chose qui change c'est que tu traîtes un plus gros volume d'un coup, tu fais des économies d'échelle ^^ c vrai que c probablement plus rapide.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
il s'agit de saquer un octet donc simplissime.
Alloues un buffer 32 Ko par exemple (pbuff). On boucle tant qu'on aspire.
A chaque tour:
BYTE *c, *d, *pout;
NextPass:
... lecture fichier
c d pbuff;
pout = pbuff + nAspires;
while(c < pbuff) {
if(*c !13) *d++ *c;
c++;
}
WriteFile(hfl, pbuff, d - pbuff, &dw, 0);
if(nAspires >= sizeBuff) goto NextPass;

BruNews, Admin CS, MVP Visual C++
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

BruNews, tu ferais comment pour limiter les accès? Tu peux pas non plus lire tout le fichier dans un tableau puis le récrire, c'est antiproductif. Et puis pour altérer des données, je vois que ça... tu lis, tu traîtes, tu écris.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
voila qui fera 2 acces fichiers par octet, un en lecture et un en ecriture.
Vous devez avoir le temps dans votre fac.

BruNews, Admin CS, MVP Visual C++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.