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

 
Emulació del comandament cp: copiar fitxers 

En aquesta pràctica emularem el comandament cp de Linux, d'aquesta forma aprendrem a obrir un arxiu i escriure i llegir octets un a un.

 

Desenvolupament de la pràctica

Creeu un nou arxiu del tipus C++ anomenat m8p04.cc i escriviu el següent codi:

//m8p04.cc - Emulació del comandament copy del MSDOS  -


#include <stdio.h>

int main(int argc, char *argv[]){
    FILE *origen, *desti;
    char car;
    int i=0;

    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)){
        putc(car,desti);
        car=getc(origen);
    }
    fclose(origen);
    fclose(desti);

    return 0;
}

Explicació del programa

Per executar aquest programa s'ha d'especificar necessàriament el nom de dos arxius, l'arxiu origen i l'arxiu destí. El programa fa la comprovació que s'escriuen aquests dos arguments en la següent part de codi:

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

En el cas que no s'hagi especificat els dos arguments, surt el missatge i acaba el programa.

S'obren simultàniament els dos arxius especificats a la línia de comandaments, un de lectura (r) i un altre d'escriptura (w), ambdos binaris (b):

    origen=fopen(argv[1],"rb");
    desti=fopen(argv[2],"wb");

La funció fopen() torna un valor a un punter NULL en el cas que no s'hagi pogut obrir l'arxiu. És sempre necessari comprovar aquest valor per tal de no fer servir un punter NULL, que pot fer caure el sistema. La comprovació en aquest cas es fa amb els dos arxius alhora:

     if (origen==NULL || desti==NULL){
        printf("no es pot realitzar l'operació\n");
        return;
    }

Una vegada oberts els dos arxius es llegeix octet per octet amb la funció getc() i s'escriu octet per octet amb la funció putc():

     car=getc(origen);
    while(!feof(origen)){
        putc(car,desti);
        car=getc(origen);
    }

El bucle s'executa fins que es trobi el final de l'arxiu origen. Aquesta comprovació es fa amb la funció feof().