Problema lettura da file .txt

di il
16 risposte

Problema lettura da file .txt

Ciao ragazzi, ho il seguente problema:

1. ho creato una funzione che mi legge da file le righe e mi crea una lista, nel caso seguente mi crea una lista di strutture chiamate spettacolo:

spettacolo *lettura_Spettacolo(FILE *fp, int sala) {

    int colonna = 0;
    char buf[BUFFER_SIZE];

   	spettacolo *testa_S = NULL;
   	spettacolo *nuovo_Nodo = NULL;
    spettacolo *prec_S = NULL;
    
    char *tok;
    
    if (fp == NULL) {
    	printf("\t\t\t SPETTACOLI sala %d \n", sala);
        print_Color("\t\t\t|-----------------------------|\n", COLOR_RED);
        print_Color("\t\t\t|      File non trovato!      |\n", COLOR_RED);

        pausa();
        return testa_S = NULL;
    } else {
    	
        while (!feof(fp)) {
        	
			fgets(buf, BUFFER_SIZE, fp);
			nuovo_Nodo = (spettacolo *) malloc(sizeof(spettacolo));
            nuovo_Nodo -> next_Spettacolo = NULL;
			
			// Inserimento in CODA alla lista della nuova struttura caricata
            if (prec_S != NULL) {
                prec_S -> next_Spettacolo = nuovo_Nodo;
            } else {
                testa_S = nuovo_Nodo;
            }
            
            char *tok;
            tok = strtok(buf, ",");
				
            while (tok) {
            	            	         	
               	if (colonna == 0) {
            	   	nuovo_Nodo -> sala = atoi(tok);
               	}
                
                if (colonna == 1) {
                   	nuovo_Nodo -> id = atoi(tok);
                }

                
                tok = strtok(NULL, ",");
                colonna++;
            	
			}
            colonna = 0;

            prec_S = nuovo_Nodo;
        }	
    }
    return testa_S;
}

2. il problema sorge quando salvo una riga (e quindi un elemento) e poi lo rimuovo.
In questo caso mi ritrovo con un file sul disco, ma vuoto.

Ho problemi quando vado a caricare la lista e mi trovo in questo caso, quello che succede è che il puntatore di inizio lista non è NULL ma uno qualsiasi e di conseguenza ho problemi nella gestione della lista. 

Come fare ad ottenere il puntatore di inizio lista pari a NULL quando il file è sul disco ma vuoto (senza righe)?

Spero di essere stato chiaro, e vi ringrazio in anticipo. Nel debug mi sono reso conto che effettivamente all'inserimento di un nuovo elemento in lista non mi soddisfa la condizione di avere la testa = NULL.

16 Risposte

  • Re: Problema lettura da file .txt

    No, non si è capito il problema. Magari fai un esempio con dei dati.

    P.S. ma perché hai creato 3 thread uguali?

  • Re: Problema lettura da file .txt

    Ho cancellato almeno 3 copie di questo thread.

    Perché continui a creare delle copie? si usa un solo thread.

  • Re: Problema lettura da file .txt

    1. Ho creato un file dal nome “spettacoli.txt”, in cui ho caricato 2 righe di elementi.

    												(1a riga) : 1,1,
    												(2a riga) : 2,2,

    2. con la funzione lettura_Spettacolo() leggo il file “spettacoli.txt” creando una lista con 2 elementi.

    3. attraverso la funzione da me implementata eseguo l'eliminazione dei due elementi, quindi sul disco mi rimane il file “spettacoli.txt” ma senza nessuna riga dentro.

    4. riapro il programma ed eseguo la funzione lettura_Spettacolo(). 

    Questa volta, avendo il file sul disco vuoto (senza nessuna riga) mi aspetto che l inizio della lista si inizializza con NULL invece ciò non accade.

  • Re: Problema lettura da file .txt

    Aspetta prima di discutere dell' argomento… non hai ancora risposto alla mia domanda. Perché hai creato 4 copie di questo thread?

  • Re: Problema lettura da file .txt

    Frans … se non rispondi a Toki, non possiamo andare avanti …

  • Re: Problema lettura da file .txt

    Ragazzi scusate, ho aperto un nuovo thred perchè penso si riferisca ad un problema diverso rispetto agli altri discussi. Se è un problema ripropongo li

  • Re: Problema lettura da file .txt

    No tu hai aperto 4 thread identici a questo, 4 copie esatte 

  • Re: Problema lettura da file .txt

    Dove dovrei controllare? a me non risulta e se dovesse essere successo non so se sia stato un problema di linea, essendo in treno.

  • Re: Problema lettura da file .txt

    I doppioni li ho già cancellati. Per i prossimi posts fai attenzione alla generazione di doppioni involontari.

    La discussione può continuare.

  • Re: Problema lettura da file .txt

    Comunque, il problema è legato al modo con cui usi la funzione feof che si usa solo DOPO una lettura e non prima.

    Quindi il ciclo va corretto in questo modo

           fgets(buf, BUFFER_SIZE, fp);
           while (!feof(fp))
           {
               //////
               //   GESTIONE NUOVO NODO
               //
               fgets(buf, BUFFER_SIZE, fp);
           } 
    
  • Re: Problema lettura da file .txt

    15/01/2023 - oregon ha scritto:


    Comunque, il problema è legato al modo con cui usi la funzione feof che si usa solo DOPO una lettura e non prima.

    Quindi il ciclo va corretto in questo modo

           fgets(buf, BUFFER_SIZE, fp);
           while (!feof(fp))
           {
               //////
               //   GESTIONE NUOVO NODO
               //
               fgets(buf, BUFFER_SIZE, fp);
           } 
    

    chiedendo scusa per l'inconveniente, penso sia stato un problema di connessione essendo in treno, non mi era mai capitato.

    Tornando a noi, e ringraziandovi per l'interesse, ho fatto come mi hai suggerito. Mi trovo un file con una riga ma non mi legge nulla, ovvero non mi carica nulla nella lista.

    spettacolo *lettura_Spettacolo(FILE *fp, int sala) {
    
        int colonna = 0;
        char buf[BUFFER_SIZE];
    
       	spettacolo *testa_S = NULL;
       	spettacolo *nuovo_Nodo = NULL;
        spettacolo *prec_S = NULL;
        
        char *tok;
        
        if (fp == NULL) {
        	printf("\t\t\t SPETTACOLI sala %d \n", sala);
            print_Color("\t\t\t|-----------------------------|\n", COLOR_RED);
            print_Color("\t\t\t|      File non trovato!      |\n", COLOR_RED);
            return testa_S = NULL;
        } else {
        	
        	fgets(buf, BUFFER_SIZE, fp);
            
    		while (!feof(fp)) {
            	
    			nuovo_Nodo = (spettacolo *) malloc(sizeof(spettacolo));
                nuovo_Nodo -> next_Spettacolo = NULL;
    			
    			// Inserimento in CODA alla lista della nuova struttura caricata
                if (prec_S != NULL) {
                    prec_S -> next_Spettacolo = nuovo_Nodo;
                } else {
                    testa_S = nuovo_Nodo;
                }
                
                tok = strtok(buf, ",");
    				
                while (tok) {
                	            	         	
                   	if (colonna == 0) {
                	   	nuovo_Nodo -> sala = atoi(tok);
                   	}
                    
                    if (colonna == 1) {
                       	nuovo_Nodo -> id = atoi(tok);
                    }
                    
                    tok = strtok(NULL, ",");
                    colonna++;
                }
                colonna = 0;
    			 
                // puntatore all'ULTIMO elemento inserito in lista
                prec_S = nuovo_Nodo;
                fgets(buf, BUFFER_SIZE, fp);
            }	
        }
        return testa_S;
    }
  • Re: Problema lettura da file .txt

    Al momento sono riuscito a risolvere in questo modo, ovvero inserendo un controllo sul puntatore all'interno del file:

    // DEFINIZIONE PUNTATORI
    
    fseek(fp, 0, SEEK_END);
    	long size;
    	
    	size = ftell(fp);
        
        char *tok;
        fseek(fp, 0, SEEK_SET);
        if(size == 0){
        	return NULL;
    	}
        
        if (fp == NULL) {
        
        // CODICE COME DA INIZIO DISCUSSIONE
    
        
  • Re: Problema lettura da file .txt

    Mi trovo un file con una riga ma non mi legge nulla, ovvero non mi carica nulla nella lista.

    cosa contiene esattamente quel file? Mostra la riga. Alla fine della riga c'è il ritorno a capo?

    P.S. Perché non impari a fare un po' di debugging passo passo e controlli il contenuto delle variabili man mano che il codice viene eseguito? Così scopri gli inghippi abbastanza semplicemente ed eviti di inventarti strade strane, oltre che impari dai tuoi sbagli.

  • Re: Problema lettura da file .txt

    Sisi ho fatto debug, per quello sono riuscito a trovare questa soluzione.

    Hai ragione, per la parte in cui salvo nel file, nel pomeriggio pubblico la psrte di codice, in ogni caso vado a capo ogni volta che scrivo, a partire dalla seconda riga

    1a riga

    \n 2a riga 

Devi accedere o registrarti per scrivere nel forum
16 risposte