Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    10

    [C]Problema con Fseek in un ciclo while

    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

    codice:
    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

    codice:
    #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
    Ultima modifica di Nasio91; 06-02-2017 a 19:11

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma perché tutta questa storia?

    Leggi i 4 dati e gestiscili in base al flag.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    10
    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?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da Nasio91 Visualizza il messaggio
    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

    codice:
    	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);
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.