Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con scrittura su file
Forum - C/C++ - Problema con scrittura su file

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Mattia99 (Member)
Rookie


Messaggi: 38
Iscritto: 19/02/2016

Segnala al moderatore
Postato alle 16:01
Venerdì, 29/04/2016
Ciao a tutti,

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

Per farlo ho usato questo metodo:

Codice sorgente - presumibilmente Delphi

  1. fp2=fopen("libri_backup.txt","w");              //CREO IL FILE DI BACKUP
  2.         fp=fopen("libri.txt","r");                              //APRO IL LETTURA IL FILE DEI LIBRI
  3.                        
  4.         while(!feof(fp)){
  5.                 fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e);                //LEGGO DAL FILE
  6.                 fprintf(fp2,"%d %s %s %s %c\n",a,b,c,d,e);      //SCRIVO SUL FILE DI BACKUP
  7.         }
  8.        
  9.         fclose (fp);
  10.         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


«Mi farebbe piacere cambiare il mondo, ma non mi danno il suo codice sorgente.»
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1451
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:11
Venerdì, 29/04/2016
Leggi a uno a uno i bytes del file 1 e lo scrivi nel file 2

PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 344
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:15
Venerdì, 29/04/2016
A me è venuta in mente una cosa di questo tipo, ma non credo sia il metodo più efficiente.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. const char kStr_NomeFileOrig[] = "file_orig.txt";
  5. const char kStr_NomeFileDest[] = "file_dest.txt";
  6.  
  7. int ApriFiles( FILE **fOrig, FILE **fDest );
  8. int CopiaFile( FILE **fOrig, FILE **fDest );
  9. void ChiudiFiles( FILE **fOrig, FILE **fDest );
  10.  
  11. int main() {
  12.     int errore = 0;
  13.     FILE *fOrig = NULL;
  14.     FILE *fDest = NULL;
  15.  
  16.     errore = ApriFiles( &fOrig, &fDest );
  17.     if( errore != 0 ) return 0;
  18.  
  19.     errore = CopiaFile( &fOrig, &fDest );
  20.  
  21.     ChiudiFiles( &fOrig, &fDest );
  22.  
  23.     if( errore != 0 ) {
  24.         remove( kStr_NomeFileDest );
  25.         printf( "\n Errore!\n\n " );
  26.         getchar();
  27.     }
  28.  
  29.     return 0;
  30. }
  31.  
  32. int ApriFiles( FILE **fOrig, FILE **fDest ) {
  33.     if( fOrig == NULL || fDest == NULL ) return 1;
  34.  
  35.     *fOrig = fopen( kStr_NomeFileOrig, "rb" );
  36.     *fDest = fopen( kStr_NomeFileDest, "wb" );
  37.  
  38.     if( *fOrig == NULL || *fDest == NULL ) {
  39.         ChiudiFiles( fOrig, fDest );
  40.         return 1;
  41.     }
  42.     else {
  43.         return 0;
  44.     }
  45. }
  46.  
  47. int CopiaFile( FILE **fOrig, FILE **fDest ) {
  48.     int errore = 0;
  49.     long i, dim;
  50.     char buff;
  51.  
  52.     fseek( *fOrig, 0, SEEK_END );
  53.     dim = ftell( *fOrig );
  54.     rewind( *fOrig );
  55.  
  56.     for( i=0; i<dim; ++i ) {
  57.         if( fread(&buff,sizeof(char),1,*fOrig) == 1 ) {
  58.             if( fwrite(&buff,sizeof(char),1,*fDest) != 1 ) {
  59.                 errore = 1;
  60.                 break;
  61.             }
  62.         }
  63.         else {
  64.             errore = 1;
  65.             break;
  66.         }
  67.     }
  68.  
  69.     return errore;
  70. }
  71.  
  72. void ChiudiFiles( FILE **fOrig, FILE **fDest ) {
  73.     if( *fOrig != NULL ) {
  74.         fclose( *fOrig );
  75.         *fOrig = NULL;
  76.     }
  77.  
  78.     if( *fDest != NULL ) {
  79.         fclose( *fDest );
  80.         *fDest = NULL;
  81.     }
  82. }


Ultima modifica effettuata da AldoBaldo il 29/04/2016 alle 23:22


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 175
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 6:55
Sabato, 30/04/2016
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

  1. fp2=fopen("libri_backup.txt","w");              
  2. fp=fopen("libri.txt","r");                              
  3.                            
  4. while(!feof(fp))
  5. {
  6.      if(fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e) == 5)                                  
  7.           fprintf(fp2,"%d %s %s %s %c\n",a,b,c,d,e);      
  8. }
  9.            
  10. fclose (fp);
  11. fclose (fp2);


Ultima modifica effettuata da Template il 30/04/2016 alle 6:58


"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande."
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:51
Sabato, 30/04/2016
Per la copia usa le funzioni del sistema con cui lavori, windows/linux


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Mattia99 (Member)
Rookie


Messaggi: 38
Iscritto: 19/02/2016

Segnala al moderatore
Postato alle 20:36
Sabato, 30/04/2016
Grazie mille a tutti!

Per risolvere il problema ho adottato questo metodo:
Codice sorgente - presumibilmente C/C++

  1. fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e);        //LEGGO DAL FILE
  2.                
  3.         while(!feof(fp)){
  4.                 fprintf(fp2,"%d %s %s %s %c\n",a,b,c,d,e);      //SCRIVO SUL FILE DI BACKUP
  5.                 fscanf(fp,"%d %s %s %s %c",&a,b,c,d,&e);        //LEGGO DAL FILE
  6.         }



:k:


«Mi farebbe piacere cambiare il mondo, ma non mi danno il suo codice sorgente.»
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:49
Sabato, 30/04/2016
Ripeto... Puoi usare una sola funzione di sistema...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Mattia99 (Member)
Rookie


Messaggi: 38
Iscritto: 19/02/2016

Segnala al moderatore
Postato alle 14:10
Domenica, 01/05/2016
Si ma facendo cosi non limito la mia applicazione sono su determinati sistemi?


«Mi farebbe piacere cambiare il mondo, ma non mi danno il suo codice sorgente.»
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:06
Domenica, 01/05/2016
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 ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo