Oppure

Loading
29/04/16 14:01
Mattia99
Ciao a tutti,

ho bisogno di copiare il contenuto di un file.txt in un altro.

Per farlo ho usato questo metodo:

fp2=fopen("libri_backup.txt","w");		//CREO IL FILE DI BACKUP
	fp=fopen("libri.txt","r");				//APRO IL LETTURA IL FILE DEI LIBRI
			
	while(!feof(fp)){
		fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e);	        //LEGGO DAL FILE
		fprintf(fp2,"%d %s %s %s %c\n",a,b,c,d,e);	//SCRIVO SUL FILE DI BACKUP
	}
	
	fclose (fp);
	fclose (fp2);
	


Facendo cosi pero, l'ultima riga del file viene copiata due volte..
Non riesco proprio a capire il problema!

Esiste un modo per copiare il file piu velocemente? Qualche funzione tipo fcopy?:d
aaa
29/04/16 21:11
TheDarkJuster
Leggi a uno a uno i bytes del file 1 e lo scrivi nel file 2
aaa
29/04/16 21:15
AldoBaldo
A me è venuta in mente una cosa di questo tipo, ma non credo sia il metodo più efficiente.

#include <stdio.h>
#include <stdlib.h>

const char kStr_NomeFileOrig[] = "file_orig.txt";
const char kStr_NomeFileDest[] = "file_dest.txt";

int ApriFiles( FILE **fOrig, FILE **fDest );
int CopiaFile( FILE **fOrig, FILE **fDest );
void ChiudiFiles( FILE **fOrig, FILE **fDest );

int main() {
    int errore = 0;
    FILE *fOrig = NULL;
    FILE *fDest = NULL;

    errore = ApriFiles( &fOrig, &fDest );
    if( errore != 0 ) return 0;

    errore = CopiaFile( &fOrig, &fDest );

    ChiudiFiles( &fOrig, &fDest );

    if( errore != 0 ) {
        remove( kStr_NomeFileDest );
        printf( "\n Errore!\n\n " );
        getchar();
    }

    return 0;
}

int ApriFiles( FILE **fOrig, FILE **fDest ) {
    if( fOrig == NULL || fDest == NULL ) return 1;

    *fOrig = fopen( kStr_NomeFileOrig, "rb" );
    *fDest = fopen( kStr_NomeFileDest, "wb" );

    if( *fOrig == NULL || *fDest == NULL ) {
        ChiudiFiles( fOrig, fDest );
        return 1;
    }
    else {
        return 0;
    }
}

int CopiaFile( FILE **fOrig, FILE **fDest ) {
    int errore = 0;
    long i, dim;
    char buff;

    fseek( *fOrig, 0, SEEK_END );
    dim = ftell( *fOrig );
    rewind( *fOrig );

    for( i=0; i<dim; ++i ) {
        if( fread(&buff,sizeof(char),1,*fOrig) == 1 ) {
            if( fwrite(&buff,sizeof(char),1,*fDest) != 1 ) {
                errore = 1;
                break;
            }
        }
        else {
            errore = 1;
            break;
        }
    }

    return errore;
}

void ChiudiFiles( FILE **fOrig, FILE **fDest ) {
    if( *fOrig != NULL ) {
        fclose( *fOrig );
        *fOrig = NULL;
    }

    if( *fDest != NULL ) {
        fclose( *fDest );
        *fDest = NULL;
    }
}
Ultima modifica effettuata da AldoBaldo 29/04/16 21:22
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
30/04/16 4:55
Template
Il tuo problema, Mattia, sta nella struttura del ciclo: dopo aver letto l'ultima riga:
-> La funzione feof() verifica che tu abbia letto l'EOF, ma questo non è successo (l'ultima cosa letta è stata l'ultima riga, l'EOF ancora non l'hai letto!), quindi fa proseguire il ciclo
-> La funzione fscanf() legge, a questo punto, dal file, e si ritrova l'EOF, quindi non aggiorna le variabili (non ha cosa metterci!)
-> La fprintf(), giustamente, fa il suo lavoro: ricopia su file (propriamente, nel buffer... ma non sottilizziamo) il contenuto delle variabili

Detto questo, una semplicissima soluzione - al limite della banalità - per evitare che tutto ciò accada consiste semplicemente nel verificare il valore di ritorno della fscanf() (la quale, nel caso non lo sapessi, ritorna il numero di dati letti ed assegnati):

fp2=fopen("libri_backup.txt","w");              
fp=fopen("libri.txt","r");                              
                           
while(!feof(fp))
{
     if(fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e) == 5)                                  
          fprintf(fp2,"%d %s %s %s %c\n",a,b,c,d,e);      
}
           
fclose (fp);
fclose (fp2);
Ultima modifica effettuata da Template 30/04/16 4:58
aaa
30/04/16 6:51
Per la copia usa le funzioni del sistema con cui lavori, windows/linux
30/04/16 18:36
Mattia99
Grazie mille a tutti!

Per risolvere il problema ho adottato questo metodo:
fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e);	//LEGGO DAL FILE
		
	while(!feof(fp)){
		fprintf(fp2,"%d %s %s %s %c\n",a,b,c,d,e);	//SCRIVO SUL FILE DI BACKUP
		fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e);	//LEGGO DAL FILE
	}


:k:
aaa
30/04/16 18:49
Ripeto... Puoi usare una sola funzione di sistema...
01/05/16 12:10
Mattia99
Si ma facendo cosi non limito la mia applicazione sono su determinati sistemi?
aaa