Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
A me è venuta in mente una cosa di questo tipo, ma non credo sia il metodo più efficiente.
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
constchar kStr_NomeFileOrig[]="file_orig.txt";
constchar 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 )return0;
errore = CopiaFile(&fOrig, &fDest );
ChiudiFiles(&fOrig, &fDest );
if( errore != 0 ){
remove( kStr_NomeFileDest );
printf("\n Errore!\n\n ");
getchar();
}
return0;
}
int ApriFiles(FILE**fOrig, FILE**fDest ){
if( fOrig ==NULL|| fDest ==NULL)return1;
*fOrig =fopen( kStr_NomeFileOrig, "rb");
*fDest =fopen( kStr_NomeFileDest, "wb");
if(*fOrig ==NULL||*fDest ==NULL){
ChiudiFiles( fOrig, fDest );
return1;
}
else{
return0;
}
}
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 il 29/04/2016 alle 23: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.
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):
Codice sorgente - presumibilmente Plain Text
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 il 30/04/2016 alle 6:58
Per la copia usa le funzioni del sistema con cui lavori, windows/linux
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Ripeto... Puoi usare una sola funzione di sistema...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Esistono funzioni di sistema per la copia sia per Windows sia per Linux. Basta usare la compilazione condizionale e il programma ricompilato funzionerà ugualmente.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.