codice:
		/**
	  * BCC32
	  * MinGW
	  **/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define  EXTENSION      ".part"
#define  SINTAX_ERROR   "Hai digitato male il comando o uno dei parametri"
#define  READ_ERROR     "Errore di lettura dal file indicato"
#define  BUFF_LN        50
#define  OK             0
#define  KO             1  
	/** Concatena il numero con l'estenzione
	  * param   num     numero del file
	  * param  *str2    stringa da concatenare
	  * return  nome file, composto da un numero identificativo ed estensione
	  **/
char *strConcat( unsigned long int num, const char *str2)
{
     char *str, str1[BUFF_LN];
     unsigned int i, j; // Unsigend int :-)
     itoa(num, str1, 10);
     str=(char *)calloc(sizeof(char), strlen(str1)+strlen(str2)+1);
     assert(str!=NULL);
     for(i=0; i<strlen(str1); i++)
        str[i]=str1[i];
     for(j=0; j<strlen(str2); j++)
        str[i+j]=str2[j];
     str[i+j]='\0';
     return str;
} // strConcat
	/** controla se un file esiste
	  * param nomeFile il nome del file
	  * return OK se il file esiste, altrimenti KO
	  **/
	  
int fileExist( const char *nomeFile)
{
	FILE *file;
    if( (file=fopen(nomeFile, "r+b") )==NULL)
		return KO;
	fclose( file );
	return OK;
} // FileExist
	/** La funzione taglia il file originale in file + piccoli con dimensione scelta
	  * param  pesoFile    dimensione di ogni parte del file in byte
	  * param  nomefile[]  nome del file di input
	  * return esito dell'elaborazione 
	  **/
int split( unsigned long int pesoFile, char *nomeFile)
{
    FILE *in, *out;
    char buff;
    unsigned long int contaByte=0;
    unsigned long int contaFile=0;
    if( ( in=fopen(nomeFile, "rb") )==NULL )
    {
        printf("%s", READ_ERROR);
        return 1;
    } // Apertura file di input
    while( !feof(in) )
    {
		if( ( out=fopen( strConcat(contaFile, EXTENSION), "wb") )==NULL )
		{
			printf("%s", READ_ERROR);
			fclose(in);
			return 1;
       	} // Apro un nuovo out ogni volta
       
		while( contaByte<pesoFile )
		{       
			fread(&buff, sizeof(char), 1, in);
			if( feof(in) ) break;
			fwrite(&buff, sizeof(char), 1, out);
			contaByte++;
		} //end while fino ache non finisco i byte per questa parte
        
        contaByte=0;
        contaFile++;
        fclose(out);
    } //end while
    fclose(in);
    fclose(out);
    return 0;
}// Split
	/** La funzione unisce in un unico file le parti trovate
	  * return dell'esito dell'elaborazione 
	  **/
int join(char nomeFile[])
{
    FILE *in, *out;
    char buff;
    unsigned long int contaFile=0;
    
    printf("\nJoin file>%s\n", nomeFile);
    // getch();
	if( (out=fopen( nomeFile, "ab") )==NULL )
    {
        printf("%s", READ_ERROR);
		return 1;
    } // Apertura file di output
    
    do
    {
		if( (in=fopen( strConcat(contaFile, EXTENSION), "rb") )==NULL)
		{
        	printf("%s",READ_ERROR);
        	fclose(out);
        	return 1;
       	} // Apro un nuovo out ogni volta
		do
		{      
			fread(&buff, sizeof(char), 1, in);
			if( feof(in) ) break;
			fwrite(&buff, sizeof(char), 1, out);
		}   // End while fino a che non finisco i byte per questa parte
		while( 1 );
		fclose(in);
	}
	while( !fileExist( strConcat(++contaFile, EXTENSION) ) );
	fclose(in);
    fclose(out);
    return 0;
}// Join
void help()
{
	printf("\nSplit & join\n");
	
	printf("Uso:\n\n");
	printf("Split [-s | -j] [numeroBytePerParte] nome file\n\n");
	printf("Per dividere un file\n");
	printf("  Split [-s] numeroBytePerParte nomeFile \n\n");
	printf("Per unire più file in uno solo:\n");
	printf("  Slit [-j] nomeFile \n");
	return;
}
int main(int argc, char *argv[])
{
	if(argc<2)
	{
		help();
		return 0;
	}
	
	if(!strcmp(argv[1], "-s"))
	{
		printf("Split del file \"%s\" in parti da %dk", argv[3], atoi( argv[2] ) );
		if(atoi(argv[2])>0)
		{
			split( atoi( argv[2]), argv[3]);
			printf("Operazione complatata");
			return 0;
		}	
	}
	if(!strcmp(argv[1], "-j"))
	{
		// printf("Join del file \"%s\" param = %dk", argv[2], atoi( argv[1] ) );
		printf("Unisco le parti");
		join( argv[2] );
		return 0;
	}
	printf("\n%s", SINTAX_ERROR);
	help();
	
	return 0;
} // main
 
Ora il file 'ricompattato' è uguale al file originale