Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
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)
Guru


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


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.
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo