Enrere Mòdul 8
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Correcció automàtica del problema dels accents

En aquesta pràctica es veurà una forma alternativa de corregir el problema dels caràcters especials a nivell d'arxiu.

 

Desenvolupament de la pràctica

Ja es va explicar en el mòdul 1 que un programa que funciona en entorn Windows, com el Visual C++, té problemes per fer aplicacions de consola, és a dir, aplicacions que es poden executar des de la línia de comandaments de l'MS-DOS. El problema radica en que Windows i MS-DOS interpreten de forma diferent els codis dels caràcters especials. Es va donar, en aquell mòdul, alguna solució per aquest problema. En aquesta pràctica veurem una altra forma de fer la conversió a nivell d'arxiu. 

Es tracta de treballar normalment en Visual C++. Una vegada que el programa funciona, executem des de la línia de comandament el programa que es presentarà a continuació. Aquest programa s'executa amb dos arguments, el nom de l'arxiu font creat amb Visual C++, i el nom d'un altre arxiu nou. Aquest programa farà una còpia d'aquest primer arxiu reemplaçant els caràcters d'un a altre sistema. Una vegada feta la conversió, amb el Visual C++ es recuperarà la nova versió i es compilarà. El programa executable creat treurà per pantalla els missatges amb els caràcters especials correctes.

Definiu un projecte nou anomenat m8pa2 i afegiu-li un arxiu de font C/C++ anomenat m8pa2.cpp. Escriviu el següent codi:

//m8pa2.cpp: Correcció dels accents


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

void main(int argc, char *argv[]){
    FILE *origen, *desti;
    char car;
    int i=0; 
    char *p;
    char *accents="áéíóúÁÉÚÓÚàèïòüÀÈÏÒÜçÇñÑ¿¡";
    char ascii[27];
    

    strcpy(ascii,"\x0A0\x082\x0A1\x0A2\x0A3");
    strcat(ascii,"\x0B5\x090\x0D6\x0E0\x0E9");
    strcat(ascii,"\x085\x08A\x08B\x095\x081");
    strcat(ascii,"\x0B7\x0D4\x0D8\x0E3\x09A");
    strcat(ascii,"\x087\x080\x0A4\x0A5\x0A8");
    strcat(ascii,"\x0AD");


    if(argc!=3){
        printf("S'ha d'especificar arxiu origen i arxiu
                destí\n");
        return;
    }

    origen=fopen(argv[1],"rb");
    desti=fopen(argv[2],"wb");
    if (origen==NULL || desti==NULL){
        printf("no es pot realitzar l'operació\n");
        return;
    }
    car=getc(origen);
    while(!feof(origen)){

        if(p=strchr(accents,car)){
             car=ascii[int(p-accents)];
        }
        putc(car,desti);
        car=getc(origen);
    }
    fclose(origen);
    fclose(desti);
}

Explicació del programa

En aquest programa es declaren dues variables de cadena: accents i ascii, cadascuna amb els caràcters especials que volem detectar i canviar. La primera d'aquestes variables conté els caràcters tal i com s'escriuen en Visual C++, l'altra variable, ascii, conté la representació ASCII dels mateixos caràcters en el mateix ordre. Fixeu-vos que per evitar que la sentència d'inicialització de la variable ascii sigui molt gran s'ha dividit en diverses sentències i s'han fet servir les funcions strcpy() i strcat() ja vistes amb anterioritat.

El programa obre els dos arxius especificats en la línia de comandaments (arguments 2 i 3 passats a la funció main()) i comprova cada caràcter de l'arxiu d'origen si es troba a la cadena accents. En cas negatiu no fa cap conversió i escriu el mateix caràcter llegit. En cas afirmatiu, com la funció strchr() retorna un punter a la posició on s'ha trobat el caràcter, l'expressió int(p-accents) dóna la posició relativa del caràcter, començant pel primer caràcter de la cadena (0).

 
  if(p=strchr(accents,car)){
             car=ascii[int(p-accents)];
        }
        putc(car,desti);