Problema file binario in scrittura

di il
26 risposte

Problema file binario in scrittura

Sto creando un archivio del lotto, quindi una struttuta con mese anno indice ed un array bidimensionale con le 10 ruote ed i 5 estratti per ogni ruota.
Inserisco i dati del primo blocco ma non riesco a memorizzarli come file binario, il comando fwrite(lotto,sizeof(lotto),1,fp); è sbagliato , non accetta il file fp.
Un aiutino.
Grazie

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

using namespace std;
FILE* fp=NULL;




typedef struct estrazione
{
  short lo[4][9];
  short ind;
  short anno;
  char mese[15];
  
  
} lot;	
struct estrazione lotto;
	int comodo,i,j;

int main()
{
	
	cout<<"crea estrazione lotto";
	cout<<"inserire anno mese indice";
	cin>>lotto.anno;cin>>lotto.mese;cin>>lotto.ind;
	for(int i=0; i<10; i++)
	{
		cout<<"inserisci i 5 estratti della ruota:"<<i+1<<endl;
	 
	 for (int j=0; j<5; j++)
	 {
	 	cin>>lotto.lo[j][i];
	 }
	  
	}
	fp = fopen("estrazioni.dat","wb");
	
	if (!fp)
	  cout << "erroe creazione file";
	 else 
	 
	   fwrite(lotto,sizeof(lotto),1,fp);
	   
	   fclose(fp);
	
}

26 Risposte

  • Re: Problema file binario in scrittura

    Il file fp non c'entra nulla. E' sbagliato il primo parametro che deve essere un puntatore alla struttura

    fwrite(&lotto,sizeof(lotto),1,fp);
  • Re: Problema file binario in scrittura

    Grazie, ora funziona, ma se vorrei aggiungere altre estrazioni come dovrei usare fwrite?
  • Re: Problema file binario in scrittura

    fabbius69 ha scritto:


    ... volessi ...
    La fwrite scrive in sequenza nel file se non diversamente specificato.
    Ti consiglio anche di rivedere la struttura a seconda delle esigenze.
    Ad esempio, è inutile memorizzare una stringa per il mese dato che basta uno short.

    Se è un esercizio, va bene, altrimenti non mi sembrano gli strumenti adatti ad un programma del genere.
    Puoi usare più tranquillamente C# e un DBMS.
  • Re: Problema file binario in scrittura

    Io programmavo anni fa in Pascal, quindi ho anni di dati dell'estrazione memorizzati in Pascal, cercavo di fare una cosa simile in c++ pero lasciando la stessa grandezza in modo da poter leggere l'archivio gia memorizzato.
    Mi sono espresso bene?
  • Re: Problema file binario in scrittura

    Se hai un file binario con quei dati, non è detto che sia utilizzabile perché dipende dall'allineamento della struttura (un discorso non difficile ma da approfondire).

    Comunque, potresti utilizzare il programma C per convertire i dati da file binario a testo (se sono estrazioni storiche trovi anche dei file disponibili in rete) e poi il file di testo lo utilizzi per importarlo in un DBMS come Access dato che un programma scritto totalmente in C non è una passeggiata, specie per un non esperto.

    Con un DB Access (o simili) potrai utilizzare linguaggi più adatti e realizzare il programma che vuoi senza tanti problemi.
  • Re: Problema file binario in scrittura

    oregon ha scritto:


    Se hai un file binario con quei dati, non è detto che sia utilizzabile perché dipende dall'allineamento della struttura (un discorso non difficile ma da approfondire).

    Comunque, potresti utilizzare il programma C per convertire i dati da file binario a testo (se sono estrazioni storiche trovi anche dei file disponibili in rete)
    Ma in pascal potrei trasformare il file binario in file di testo ed in c leggerlo ( si può?) e trasformarlo in binario più addato .
    Cosa ne pensi?
  • Re: Problema file binario in scrittura

    Stai facendo confusione.

    Perché devi programmare in C e non continui in Pascal?

    Se devi imparare (dato che il C non lo conosci), la cosa migliore è lasciarlo perdere e imparare il C# per lavorare molto più comodamente con un DB.

    Quindi

    1) converti i dati da binario a testo con il tuo codice Pascal
    2) importa i dati in un DB (Access MDB può andare bene)
    3) utilizza comodamente il DB con un programma C# e le query in SQL
  • Re: Problema file binario in scrittura

    oregon ha scritto:


    Se devi imparare (dato che il C non lo conosci), la cosa migliore è lasciarlo perdere e imparare il C#
    Prima volevo imparare il C, almeno per un paio di mese provare a fare gli stessi programmi che ho in pascal.
    Un domanda su fread; come riesco a leggere tutte le estrazioni di seguito e non solo la prima nel file che memorizzo.
    se metto fread(&lotto,sizeof(lotto),1,fp); in un ciclo parte sempre dal primo.
    Grazie
  • Re: Problema file binario in scrittura

    Ovviamente parte dal primo e poi leggi le altre fino a leggerle tutte. Cosa non ti è chiaro?
  • Re: Problema file binario in scrittura

    oregon ha scritto:


    Ovviamente parte dal primo e poi leggi le altre fino a leggerle tutte. Cosa non ti è chiaro?
    pensavo che fread(&lotto,sizeof(lotto),1,fp) ogni volta si posizionasse all'inizio del file.
  • Re: Problema file binario in scrittura

    Hai letto la documentazione della fread? L'hai provata?
  • Re: Problema file binario in scrittura

    Il codice mi restituisce valori diversi da quelli che ho inserito , perchè?
    
    fp = fopen("estrazioni.dat","rb");
    	
    	if (!fp)
    	  cout << "erroe creazione file";
    	 else 
    	
    	   fread(&lotto,sizeof(lotto),1,fp);
    	   cout<<lotto.anno<<endl;
    	   cout<<lotto.mese<<endl;
    	  fread(&lotto,sizeof(lotto),1,fp);
    	  cout<<lotto.ind<<endl;
    	  cout<<lotto.mese;
    	   fclose(fp);
    
  • Re: Problema file binario in scrittura

    Per essere sicuri di quello che fai

    1) cancella il file dei dati

    2) scrivi i dati

    3) leggi i dati

    Se qualcosa non va, facci vedere il codice che ha scritto e quello che ha letto.
  • Re: Problema file binario in scrittura

    Visiona il numero 10 più un simbolo strano 49 ed ripete un simbolo strano.

    Scrive l'estrazione
    
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    using namespace std;
    FILE* fp=NULL;
    
    
    
    
    typedef struct estrazione
    {
      short lo[4][9];
      short ind;
      short anno;
      char mese[15];
      
      
    } lot;	
    struct estrazione lotto;
    	int comodo,i,j;
    
    int main()
    {
    	
    	cout<<"crea estrazione lotto";
    	cout<<"inserire anno mese indice"<<;
    	cin>>lotto.anno;cin>>lotto.mese;cin>>lotto.ind;
    	for(int i=0; i<10; i++)
    	{
    		cout<<"inserisci i 5 estratti della ruota:"<<i+1<<endl;
    	 
    	 for (int j=0; j<5; j++)
    	 {
    	 	cin>>lotto.lo[j][i];
    	 }
    	  
    	}
    	fp = fopen("estrazioni.dat","wb");
    	
    	if (!fp)
    	  cout << "erroe creazione file";
    	 else 
    	 
    	   fwrite(&lotto,sizeof(lotto),1,fp);
    	   
    	   fclose(fp);
    	
    }
    
    Lettura file binario
    
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    using namespace std;
    FILE* fp=NULL;
    
    
    
    
    typedef struct estrazione
    {
      short lo[4][9];
      short ind;
      short anno;
      char mese[15];
      
      
    } lot;	
    struct estrazione lotto;
    	int comodo,i,j;
    
    int main()
    {
    	
    	/*cout<<"crea estrazione lotto";
    	cout<<"inserire anno mese indice";
    	cin>>lotto.anno;cin>>lotto.mese;cin>>lotto.ind;
    	for(int i=0; i<10; i++)
    	{
    		cout<<"inserisci i 5 estratti della ruota:"<<i+1<<endl;
    	 
    	 for (int j=0; j<5; j++)
    	 {
    	 	cin>>lotto.lo[j][i];
    	 }
    	  
    	}*/
    	fp = fopen("estrazioni.dat","rb");
    	
    	if (!fp)
    	  cout << "erroe creazione file";
    	 else 
    	
    	   fread(&lotto,sizeof(lotto),1,fp);
    	   cout<<lotto.anno<<endl;
    	   cout<<lotto.mese<<endl;
    	   cout<<lotto.ind<<endl;
    	 /* fread(&lotto,sizeof(lotto),1,fp);
    	  cout<<lotto.ind<<endl;
    	  cout<<lotto.mese;*/
    	   fclose(fp);
    	
    }
    
Devi accedere o registrarti per scrivere nel forum
26 risposte