Problema scrittura file dat a me incompresibile.

di il
20 risposte

Problema scrittura file dat a me incompresibile.

Salve a tutti.
Sono nuovo del forum e piuttosto nuovo a provare a programmare in C.
Ho un file di testo che su ogni riga ha 3 numeri separati da uno spazio,
voglio scrivere questi numeri in un file .dat per poterlo elaborare successivamente.
il programma funziona apparentemente bene, quando però lo lancio con un file di testo che ha circa 300 righe il file dat generato in realtà da un certo tot di righe risulta illeggibile... spero di essere sufficientemente chiaro. Non so veramente da dove partire per risolvere il problema, oramai sono giorni che faccio tentativi, il programma risponde in modo veramente strano.

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

typedef struct member{
float idm;
float jp;
float js;
int newm;
}member;

int main()
{
FILE *sf;
FILE *lf;

int n=0;
int num;
int size;
long count;

member ms={0,0,0,0};
member mr={0,0,0,0};

lf = fopen("mem_pas.txt", "r");
sf = fopen("member.dat", "w");

while( !feof(lf) )
{
ms.idm=0;
ms.jp=0;
ms.js=0;
ms.newm=0;
fscanf(lf, "%f %f %f\n", &ms.idm, &ms.jp, &ms.js);
ms.newm=0;

n=fwrite( &ms, sizeof(ms), 1, sf);
}
fclose(lf);
fclose(sf);

lf=fopen("member.dat", "r");
while ( !feof(lf) )
{
mr.idm=0;
mr.jp=0;
mr.js=0;
mr.newm=0;
if( fread( &mr, sizeof(mr), 1, lf) )
printf(" ID %f Primo:%f secondo:%f new: %i\n\n", mr.idm, mr.jp, mr.js, mr.newm);
else printf("err\n");

}
fclose(lf);

return 0;
}

come ambiente utilizzo DEV C++ su windows 7

grazie dell'interesse profuso.

Fabrizio

20 Risposte

  • Re: Problema scrittura file dat a me incompresibile.

    Se devi scrivere in modalità binaria, sotto window, aprì il file come "wb".
    infine no usare dev che è pieno di bug e non più supportato ormai da 10 anni e ne è passata di acqua sotto i ponti....
  • Re: Problema scrittura file dat a me incompresibile.

    Per favore usa i tag code per postare codice.

    Il problema è che scrivi un file binario, e ovviamente non puoi leggerlo come se fosse scritto in formato testuale.

    Se provi a modificare la parte relativa alla lettura vedrai che funziona, te la modifico al volo e dovrebbe funzionare correttamente.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    typedef struct member {
        float idm;
        float jp;
        float js;
        int newm;
    } member;
    
    int main() {
        FILE *sf;
        FILE *lf;
    
        int n=0;
        int num;
        int size;
        long count;
    
        member ms;
        member mr;
    
        lf = fopen("mem_pas.txt", "r");
        sf = fopen("member.dat", "w");
    
        while( !feof(lf) ) {
            fscanf(lf, "%f %f %f\n", &ms.idm, &ms.jp, &ms.js);
            ms.newm=0;
            n=fwrite( &ms, sizeof(ms), 1, sf);
        }
        fclose(lf);
        fclose(sf);
    
        lf=fopen("member.dat", "r");
        while ( n=(fread( &mr, sizeof(mr), 1, lf))>0 ) {
            if(n)
                printf(" ID %f Primo:%f secondo:%f new: %i\n\n", mr.idm, mr.jp, mr.js, mr.newm);
            else printf("err\n");
        }
        fclose(lf);
    
        return 0;
    }
    
  • Re: Problema scrittura file dat a me incompresibile.

    Grazie delle riposte.
    Oggi ho compilato il codice su un'altro compilatore da un pc di un amico e funziona regolarmente.
    Avete ragione il problema a quanto pare è propio DEVc++

    mi consigliate per favore un compilatore piu ambiente stile DEVc++ per capirci,
    che ovviamente sia attuale e non abbia bag.

    in parole povere qualcosa di semplice e affidabile.

    grazie mille
  • Re: Problema scrittura file dat a me incompresibile.

    Code::Blocks è opensource e lo puoi scaricare insieme al compilatore tdm-mingw aggiornato.
  • Re: Problema scrittura file dat a me incompresibile.

    Code::Blocks se non sbaglio e per linux.
    Per windows c'è niente di ugualmente valido.

    grazie
  • Re: Problema scrittura file dat a me incompresibile.

    Code blocks gira su tutti i sistemi operativi, vai nella sezione download e scarica quella per windows con il compilatore.


    Volendo c'è anche codelite o geany.
  • Re: Problema scrittura file dat a me incompresibile.

    Ho scaricato CodeBlocks 13.12 per windows
    ho ridotto il programma all'osso...
    alla fine credo che ci sia un bag sulla funzione fread...
    mi spiego meglio:

    il tutto viene compilato senza errori ma quando lanciamo l'eseguibile se inputiamo il numero 26 fread non digerisce questo intero.....

    il file dat generato aperto con un lettore esadecimale è ben riempito...

    il codice è il seguente:
    # include <stdio.h>
    #include <stdlib.h>
    
    struct elemento{
    	long matricola;
    	int materie;
    };
    
    int main ()
    {
    	FILE *pf;
    	int i, num;
    	struct elemento el;
    
    	pf=fopen("numeri.dat","w");
    	if (pf)
    		{
    			for (i=0; i<4; i++)
    			{
    				printf("inserisci la matricola: ");
    				scanf("%ld", &(el.matricola));
    				printf("inserisci il numero di esami: ");
    				scanf("%d", &el.materie);
    				fwrite(&el, sizeof( struct elemento), 1, pf);
    			}
    			fclose (pf);
    		}
    	else
    	exit(1);
    
    
    	pf = fopen("numeri.dat","r");
    	if (pf)
    		{
    			for (i=0; i<4; i++)
    			{
    				fread(&el, sizeof(struct elemento), 1, pf);
    
    
    				//printf("%ld %d\n",el.matricola, el.materie);
    
    				printf("matricola: %ld\t materie: %d\n", el.matricola, el.materie);
    			}
    			fclose(pf);
    		}
    		else
    		exit(1);
    }
    l'eventuale bug nel compilatore a chi va segnalato?

    grazie
  • Re: Problema scrittura file dat a me incompresibile.

    zioribaf ha scritto:


    il tutto viene compilato senza errori ma quando lanciamo l'eseguibile se inputiamo il numero 26 fread non digerisce questo intero.....
    Che cosa intendi?
  • Re: Problema scrittura file dat a me incompresibile.

    Lanciando l'eseguibile ci viene chiesto 4 volte di inserire 2 numeri:

    matricola e materie

    se inputiamo il numero 26 in qualsiasi posizione
    il programma genera il dat,
    ma dal 26 compreso leggera nume errati.

    il problema secondo me è nella funzione "fread"
    infatti il file dat aperto con un lettore esadecimale è corretto.

    grazie

    fabrizio
  • Re: Problema scrittura file dat a me incompresibile.

    Io l'ho appena provato e sembra funzionare!

    Scrivimi i numeri che digiti ed evidenzia qual è l'output che ti genera!
  • Re: Problema scrittura file dat a me incompresibile.

    L'ho compilato con CodeBlocks

    ecco cosa succede:

    C:\Users\10000227>"H:\genera dat\disp01.exe"
    inserisci la matricola: 1
    inserisci il numero di esami: 2
    inserisci la matricola: 3
    inserisci il numero di esami: 4
    inserisci la matricola: 26
    inserisci il numero di esami: 5
    inserisci la matricola: 6
    inserisci il numero di esami: 7
    matricola: 1 materie: 2
    matricola: 3 materie: 4
    matricola: 3 materie: 4
    matricola: 3 materie: 4

    quelli evidenziati in rosso sono sbagliati...
    grazie
  • Re: Problema scrittura file dat a me incompresibile.

    A me genera questi! E sembra corretto.

    inserisci la matricola: 1
    inserisci il numero di esami: 2
    inserisci la matricola: 3
    inserisci il numero di esami: 4
    inserisci la matricola: 26
    inserisci il numero di esami: 5
    inserisci la matricola: 6
    inserisci il numero di esami: 7
    matricola: 1 materie: 2
    matricola: 3 materie: 4
    matricola: 26 materie: 5
    matricola: 6 materie: 7
  • Re: Problema scrittura file dat a me incompresibile.

    A rigore il codice dovresti correggerlo nel controllo dei file pointer.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct elemento {
        long matricola;
        int materie;
    };
    
    int main () {
        FILE *pf;
        int i;
        struct elemento el;
    
        pf=fopen("numeri.dat","w");
        if (pf!=NULL) {
            for (i=0; i<4; i++) {
                printf("inserisci la matricola: ");
                scanf("%ld", &(el.matricola));
                printf("inserisci il numero di esami: ");
                scanf("%d", &el.materie);
                fwrite(&el, sizeof( struct elemento), 1, pf);
            }
            fclose (pf);
        } else
            exit(1);
    
        pf = fopen("numeri.dat","r");
        if (pf!=NULL) {
            for (i=0; i<4; i++) {
                fread(&el, sizeof(struct elemento), 1, pf);
                printf("matricola: %ld\t materie: %d\n", el.matricola, el.materie);
            }
            fclose(pf);
        } else
            exit(1);
    
        return 0;
    }
    
    Vedi se così riscontri ancora problemi! Anche se non dovrebbe essere questo il problema!
  • Re: Problema scrittura file dat a me incompresibile.

    Che ambiente usi?
    con che compilatore?
    ambiente windows?

    perdona l'invadenza, giusto per capire....

    grazie
Devi accedere o registrarti per scrivere nel forum
20 risposte