Problema file binario in scrittura

di fabbius69 il
26 risposte
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

  • 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);
  • Grazie, ora funziona, ma se vorrei aggiungere altre estrazioni come dovrei usare fwrite?
  • 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.
  • 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?
  • 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.
  • 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?
  • 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
  • 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
  • Ovviamente parte dal primo e poi leggi le altre fino a leggerle tutte. Cosa non ti è chiaro?
  • 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.
  • Hai letto la documentazione della fread? L'hai provata?
  • 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);
    
  • 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.
  • 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