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

    [C] Copiare un qualsiasi file

    Vorrei poter copiare un file di qualsiasi natura:

    Codice PHP:
    #include <stdlib.h>
    #include <stdio.h>

    int main(int argcchar** argv){
        
    FILE *fs;
        
    FILE *fs2;
        
    int i=0;
        
    char *buffer;

        
    buffer malloc(sizeof(char));

        
    fs fopen(argv[0],"rb");

        if(
    fs == NULL){
            
    printf("error open %s\n",argv[0]);
            return -
    1;
        }

        
    fs2 fopen(argv[1],"wb");

        if(
    fs2 == NULL){
            
    printf("error open %s\n",argv[1]);
            return -
    1;
        }

        while(
    fread(&buffer[i],sizeof(char),1,fs) == 1){
            
    i++;
            
    buffer realloc(buffer, (i+1) * sizeof(char));
        }
        
        
    buffer[i] = EOF;

        
    i=0;

        while(
    buffer[i] != EOF){        
            
    fwrite(&buffer[i],sizeof(char),1,fs2);
            
    i++;
        }
        
        
    fclose(fs);
        
    fclose(fs2);

        return 
    0;

    Questa bozza di codice funziona se opero su un file di testo ma se voglio copiarmi un'immagine o un video non va! cosa sto sbagliando?

    grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C] Copiare un qualsiasi file

    Originariamente inviato da hurricane86
    Questa bozza di codice funziona se opero su un file di testo ma se voglio copiarmi un'immagine o un video non va! cosa sto sbagliando?
    Innanzitutto non vedo alcun motivo per cui tu debba allocare e poi riallocare man mano un blocco di memoria. Stabilisci una dimensione fissa per il buffer e usa quello. Es. char buffer[1024] e copia a blocchi di 1024 byte (caso particolare ovviamente l'ultimo blocco).

    Inoltre nessun carattere deve essere trattarlo in modo "speciale", pertanto è sbagliato testare o impostare un byte con EOF. Tra l'altro la costante EOF vale -1 e non è da intendere in ogni caso come "il carattere di end-of-file", che nella codifica ASCII è 0x1A.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    posto la mia nuova soluzione:

    Codice PHP:
    #include <stdlib.h>
    #include <stdio.h>

    int main(int argcchar** argv){
        
    FILE *fs;      /* File sorgente */
        
    FILE *fs2;     /* File destinatario */
        
    int i=0;       /* Contatore */
        
    int j=0;       /* Contatore */
        
    char buffer[1024];     /* buffer */
        
        
    fs fopen(argv[1],"rb");

        if(
    fs == NULL){
            
    printf("error open source file: %s\n",argv[1]);
            return -
    1;
        }

        
    fs2 fopen(argv[2],"wb");

        if(
    fs2 == NULL){
            
    printf("error open target file: %s\n",argv[2]);
            return -
    1;
        }

        while(
    fread(&buffer[i],sizeof(char),1,fs) == 1){
            
    i++;
        }
        
        while(
    j<i){        
            
    fwrite(&buffer[j],sizeof(char),1,fs2);
            
    j++;
        }
        
        
    fclose(fs);
        
    fclose(fs2);

        return 
    0;

    la cosa curiosa è che a volte va a volte no... ho provato con'immagine gif e va ho provato con un file zip e non va (ovviamente tutti files sotto 1MB)

  4. #4
    Continuo a non trovare una soluzione nessuno che mi può aiutare?

  5. #5
    1) Io inserirei un controllo su argc per verificare se siano stati passati DUE parametri da linea di comando

    2) Perché usi un buffer se poi leggi e scrivi un carattere alla volta?

    3) Aumenta la dimensione del buffer a 4096, elimina i due cicli while e sostituiscili con questo

    codice:
    while ((dim = fread(buffer, sizeof(char), sizeof(buffer), fs)) > 0) 
        { 
          fwrite(buffer, sizeof(char), dim, fs2); 
        }
    Così dovrebbe funzionare (meglio).

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    156
    cosi' funziona solo per file più piccoli di 1024 byte.
    devi leggere un blocco e poi scriverlo nel file di uscita e ripetere la sequenza read-write finchè non hai esaurito il file di ingresso. Non puoi copiate "tutto" in un botto.

    --EDIT--
    anticipato...

  7. #7
    ok ho risolto!!! molte grazie

    posto il codice se servisse a qualcuno:

    Codice PHP:
    #include <stdlib.h>
    #include <stdio.h>

    #define MAX_FILE_SIZE 4096

    int main(int argcchar** argv){
        
    FILE *fs;      /* File sorgente */
        
    FILE *fs2;     /* File destinatario */
        
    int dim=0;     /* Numero di byte letti */
        
    unsigned char buffer[MAX_FILE_SIZE];     /* buffer */
        
        
    if(argc != 3) return -1;
        
        
    fs fopen(argv[1],"rb");

        if(
    fs == NULL){
            
    printf("error open source file: %s\n",argv[1]);
            return -
    1;
        }

        
    fs2 fopen(argv[2],"wb");

        if(
    fs2 == NULL){
            
    printf("error open target file: %s\n",argv[2]);
            return -
    1;
        }

        while ((
    dim fread(buffersizeof(char), sizeof(buffer), fs)) > 0){ 
              
    fwrite(buffersizeof(char), dimfs2); 
        }
        
        
    fclose(fs);
        
    fclose(fs2);

        return 
    0;


  8. #8
    codice:
    #include <stdlib.h> 
    #include <stdio.h>
    
    int main(int argc, char** argv){ 
        FILE *fs;      /* File sorgente */ 
        FILE *fs2;     /* File destinatario */ 
        int dim = 0;       /* Contatore */ 
        char buffer[4096];     /* buffer */ 
    	
    	if (argc < 2)
    	  {
    	    puts("Specifica 2 parametri"); 
    		return -2;
    	  }
         
        fs = fopen(argv[1],"rb"); 
    
        if(fs == NULL){ 
            printf("error open source file: %s\n",argv[1]); 
            return -1; 
        } 
    
        fs2 = fopen(argv[2],"wb"); 
    
        if(fs2 == NULL){ 
            printf("error open target file: %s\n",argv[2]); 
            return -1; 
        } 
    
        while ((dim = fread(buffer, sizeof(char), sizeof(buffer), fs)) > 0) 
        { 
          fwrite(buffer, sizeof(char), dim, fs2); 
        }
         
        fclose(fs); 
        fclose(fs2); 
    
        return 0; 
    }

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.