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: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