PDA

Visualizza la versione completa : [C]Problema con Fseek in un ciclo while


Nasio91
06-02-2017, 17:42
Salve, ho creato una funzione che legge da file una tabella 240*4 e memorizzare i dati in due diverse strutture a seconda se l'elemento nell'ultima colonna è uguale a 1 o 0
I dati sono strutturati nel seguente modo
mat o m i/o Mat=matricola o=ora m=minuti i/o=ingresso o uscita
10097 17 42 0
10097 07 32 1
12406 07 35 1
20941 07 54 1
10097 12 45 0
20941 12 57 0
10097 13 04 1
12406 13 10 0

la seguente matrice è stata copiata e incollata 30 volte su un file chiamato turni.txt per simulare le entrate e uscite da una fabbrica di un mese lavorativo per 3 operai.
Al fine di calcolare le ore lavorative mensili di ogni operaio devo memorizzare le stringhe terminanti con 0 in una struttura operai entrata, e quelle terminanti con 1 in operai uscita
così dichiarata



typedef struct{
int mat; //matricola operaio
int ore; //ora timbro
int minuti; //minuti timbro
int flag; //flag 1 per ingresso fabbrica flag 0 per uscita fabbrica
}operai;



Per cercare di leggere da file le due strutture ho creato questa funzione




#include <stdio.h>
#include <stdlib.h>
#include "operai.h"




void leggi_file(operai *entrata, operai *uscita)
{
FILE *leggi;
int i=0;
int j=0;
int flag;


if((leggi=fopen("turni.txt", "r"))==NULL)
printf("impossbile aprire il file turni.txt\n");

/*fscanf(leggi, "%d", &entrata[i].mat);
fscanf(leggi, "%d", &entrata[i].ore);
fscanf(leggi, "%d", &entrata[i].minuti);
printf("dimensione bit %d", ftell(leggi));*/ //ftell ritorna 11




while(!feof(leggi)){
fseek(leggi, 11, SEEK_CUR); //posizione il puntatore file prima del 4 elemento della riga
fscanf(leggi, "%d", &flag ); //memorizza 4 elemento in flag

if(flag==1){ /*se flag==1
fseek(leggi, -11, SEEK_CUR); ritorna dalla posizione corrente 11 bit indietro e leggi
fscanf(leggi, "%d", &entrata[i].mat); da inizio riga. */
fscanf(leggi, "%d", &entrata[i].ore);
fscanf(leggi, "%d", &entrata[i].minuti);
fscanf(leggi, "%d", &entrata[i].flag);
i++;
}else if(flag==0){
fseek(leggi, -11, SEEK_CUR);
fscanf(leggi, "%d", &uscita[j].mat);
fscanf(leggi, "%d", &uscita[j].ore);
fscanf(leggi, "%d", &uscita[j].minuti);
fscanf(leggi, "%d", &uscita[j].flag);
j++;
}
}
fclose(leggi);


}




Il problema è che se provo a stampare a schermo le strutture ho risultati davvero bizzari, e non riesco a capire il motivo per il quale non riesco a memorizzare correttamente i dati del file all'interno della struttura

oregon
06-02-2017, 18:30
Ma perché tutta questa storia?

Leggi i 4 dati e gestiscili in base al flag.

Nasio91
06-02-2017, 19:34
Volevo evitare di allocare inutilmente spazio per memorizzare le variabili, avevo già pensato a ciò, e volevo anche testare a fondo le funzionalità di Fseek, comunque per scopo puramente didattico cosa non va nel codice?

oregon
07-02-2017, 10:32
Volevo evitare di allocare inutilmente spazio per memorizzare le variabili,

Questo � assurdo perch� sono pochi byte !

Comunque, solo a scopo didattico, tu non tieni presente il fatto che, dopo la lettura del flag, il puntatore si sposta, quindi 11 non vale pi� ... Studia un po' queste modifiche del ciclo, facendo attenzione a tutte le modifiche fatte



while(!feof(leggi)){
fseek(leggi, 11, SEEK_CUR);
fscanf(leggi, "%d", &flag );
fseek(leggi, -13, SEEK_CUR);

if(flag==1)
{ /*se flag==1 da inizio riga. */
fscanf(leggi, "%d", &entrata[i].mat);
fscanf(leggi, "%d", &entrata[i].ore);
fscanf(leggi, "%d", &entrata[i].minuti);
fscanf(leggi, "%d\n", &entrata[i].flag);
i++;
}
else
{
fscanf(leggi, "%d", &uscita[j].mat);
fscanf(leggi, "%d", &uscita[j].ore);
fscanf(leggi, "%d", &uscita[j].minuti);
fscanf(leggi, "%d\n", &uscita[j].flag);
j++;
}
}
fclose(leggi);
}

Loading