Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C]Errore in programma per splittare i file, dov'è il problema?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.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 nuemro con l'estenzione
    *@param   num     numero del file
    *@param  *str2    stringa da concatenzare
    *@return  nome file composto da un nuemro identificativo e estensione
    */
    char *strConcat(unsigned long int num,const char *str2){
         char *str,str1[BUFF_LN];
         int i,j;
         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;
          else
              return OK;
    }/*fileExist*/
    
    /**La funzione taglia il file originale in file + piccoli con dimensioen 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 && !feof(in)){             
              fread(&buff,sizeof(char),1,in);
              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 esito dell'elaborazione 
    */
    int join(){
        FILE *in,*out;
        char buff;
        unsigned long int contaFile=0;
        
        if((out=fopen("out","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*/  
           
            while(!feof(in)){             
              fread(&buff,sizeof(char),1,in);
              fwrite(&buff,sizeof(char),1,out);
            }/*end while fino ache non finisco i byte per questa parte*/
            fclose(in);
        }while(!fileExist(strConcat(++contaFile,EXTENSION)));
    
        fclose(in);
        fclose(out);
        return 0;
    }/*join*/
    
    
    int main(int argv,char *argc[]){
       if(argc[3]!=""){
            if(!strcmp(argc[1],"-s")){
                    if(atoi(argc[2])>0)
                         split(atoi(argc[2]),argc[3]);
                      else
                          printf("%s",SINTAX_ERROR);
            }else{
                 if(!strcmp(argc[1],"-j"))
                     join();
                   else
                      printf("%s",SINTAX_ERROR);}
        }else
           printf("%s",SINTAX_ERROR);
             
        return 0;
    }/*main*/
    il programma da dei problemi nelle giunzioni tra 2 parti di file, hio provato a splittare una immagine e poi a unirla, si vede, però nelel giunzioni tra le diverse parti ci sono alcuni errori. Non riesco a capire perchè

    le uniche funzioni che potrebbero creare problemi sono join e split, le altre le ho testate.

    per splittare digitare da linea di comando:
    nomeProg -s numeroBytePerParte nomeFile

    per unire + parti:
    nomeProg -j


    So che mancanop dievrse cose, ma mi interessava che generalmente funzionassero le funzioni per unire e tagliare poi tutta la gesione degli errori e gli abbellimenti li farò con calma.

    Grazie per ogni suggerimento.

    P.S.: ho usato i commenti javadoc perchè sono effettivamente molto leggibili

  2. #2
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Ti crea quel problema solo con le immagini? Una volta ho dovuto creare un applicativo simile ed ho pianto finché ho scoperto che bisognava impostare un flag (O_BINARY o qualcosa del genere) per impedire che le funzioni di copia trasformassero la sequenza <CR><LF> in un solo carattere e, guarda caso, le immagini jpg fanno uso massiccio di quella sequenza.
    Su quale sistema operativo stai lavorando?

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Nella funzione FileExist, se ti può interessare. hai dimenticato di chiudere il file
    fclose(file);
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Originariamente inviato da ibykos
    impostare un flag (O_BINARY o qualcosa del genere)
    come si fa a modifircare un flag?

  5. #5
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Ho scritto un programma che fa lo stesso lavoro che vuoi fare tu ed ho visto che su windows funziona tutto anche senza impostare flag strani.
    Se vuoi posso mostrarti il codice che ho scritto io.
    Ciao!

  6. #6
    Originariamente inviato da ascatem2
    ..
    il programma da dei problemi nelle giunzioni tra 2 parti di file, hio provato a splittare una immagine e poi a unirla, si vede, però nelel giunzioni tra le diverse parti ci sono alcuni errori. Non riesco a capire perchè
    ...
    Perchè sia nella funzione 'split()' che nella 'join()'
    leggi un carattere da 'in' lo scrivi su 'out' e solo dopo
    verifichi se è stata superata la fine del file...
    Inserendo la verifica tra la fase lettura e la fase scrittura
    il tuo prog funziona
    Originariamente inviato da ascatem2
    come si fa a modifircare un flag?
    Nel tuo caso 'O_BINARY' non serve, in quanto in fopen
    codice:
    fopen(nomeFile, "rb")
    la "b" nei parametri specifica già l'apertura del file
    in modalità binaria.
    ("t" per la modalità testo)
    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
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.