Problema ordinamento in un file [C]

di il
39 risposte

Problema ordinamento in un file [C]

Ciao a tutti ragazzi ho un problema con il codice che deve ordinare un file in base alla parte reale di un numero complesso, quando va in esecuzione mi da segmentation fault e non capisco quale sia il puntatore che mi da problemi e perché.
Lista ordina_lista(Lista *p_lista){

	FILE* fp = fopen("lista.txt", "a");
	Lista *bubble = NULL, *swap = NULL;
	nodo = *p_lista;
    	if ( !nodo && !nodo->next) 
		return nodo;
   
    	int scambio;
  	
	   
    	do
   	{
        	scambio = 0;
	       
        	/*il primo è speciale*/
        	if ( nodo->reale > nodo->next->reale )
        	{
            		scambio =! scambio;
            		/*tolgo dalla lista il secondo elemento*/
            		*bubble = nodo->next;
            		nodo->next = (*bubble)->next;
            		/*metto l'elemento tolto in testa alla lista*/
            		(*bubble)->next = nodo;
            		nodo = *bubble;
       		}
        	/*tutti gli altri confronto il sucessivo con il sucessivo sucessivo
        	in questo modo non perdo il riferimento al precedente*/
        	for(*bubble = nodo; (*bubble)->next->next; *bubble = (*bubble)->next)
        	{
            		if ( (*bubble)->next->reale > (*bubble)->next->next->reale )
            		{
                		if ( !scambio ) 
					scambio =! scambio;
            
                		/*tolgo dalla lista l'elemento sucessivosucessivo*/
 				*swap = (*bubble)->next->next;
                		(*bubble)->next->next = (*swap)->next;
                		/*swappo*/
                		(*swap)->next = (*bubble)->next;
                		(*bubble)->next = *swap;
            		}       
        	}
    	}while(scambio);
	fclose(fp);
    	return nodo;

}

39 Risposte

  • Re: Problema ordinamento in un file [C]

    ofcar ha scritto:


    ho un problema con il codice che deve ordinare un file in base [...]
    Ciao,
    tu parli di ordinare un file, ma così stai ordinando la lista che è stata creata a partire dai valori contenuti nel file. Quindi se ordini la lista non succede nulla a ciò che è memorizzato nel file! Se invece vuoi proprio modificare il contenuto del file, allora devi fare come avevamo visto: ordinare la lista, trascriverla su un nuovo file, cancellare il vecchio file e rinominare il nuovo in modo che abbia lo stesso nome del vecchio.
  • Re: Problema ordinamento in un file [C]

    minomic ha scritto:


    ofcar ha scritto:


    ho un problema con il codice che deve ordinare un file in base [...]
    Ciao,
    tu parli di ordinare un file, ma così stai ordinando la lista che è stata creata a partire dai valori contenuti nel file. Quindi se ordini la lista non succede nulla a ciò che è memorizzato nel file! Se invece vuoi proprio modificare il contenuto del file, allora devi fare come avevamo visto: ordinare la lista, trascriverla su un nuovo file, cancellare il vecchio file e rinominare il nuovo in modo che abbia lo stesso nome del vecchio.
    Avevo provato anche quello ma non mi riusciva comunque quindi avevo pensato che essendo una cosa diversa magari si poteva fare così, è da poco che programmo in c ancora ci devo prendere la mano.
    Praticamente il codice che ho postato sopra per la lista è corretto se non centrasse niente il file? E poi in caso fosse corretto come faccio a modificare anche il file e non solo la lista utilizzando l'altro file?
  • Re: Problema ordinamento in un file [C]

    Il codice sopra non l'ho controllato, ma se ti dà un segmentation fault allora sicuramente non è corretto.

    Per modificare il file devi fare come dicevo prima: aprire un secondo file in scrittura, trascrivere quello che vuoi che sia il nuovo contenuto del file, eliminare il vecchio e rinominare il nuovo. Altrimenti è una operazione a senso unico: tu leggi dal file, fai tutti i cambiamenti che vuoi (ordini, inserisci, elimini, ...) ma quando il programma termina, tutti i cambiamenti vanno persi. E questo perché hai solo letto dal file, senza scrivere nulla.
  • Re: Problema ordinamento in un file [C]

    ofcar ha scritto:


    minomic ha scritto:


    ofcar ha scritto:


    ho un problema con il codice che deve ordinare un file in base [...]
    Ciao,
    tu parli di ordinare un file, ma così stai ordinando la lista che è stata creata a partire dai valori contenuti nel file. Quindi se ordini la lista non succede nulla a ciò che è memorizzato nel file! Se invece vuoi proprio modificare il contenuto del file, allora devi fare come avevamo visto: ordinare la lista, trascriverla su un nuovo file, cancellare il vecchio file e rinominare il nuovo in modo che abbia lo stesso nome del vecchio.
    Avevo provato anche quello ma non mi riusciva comunque quindi avevo pensato che essendo una cosa diversa magari si poteva fare così, è da poco che programmo in c ancora ci devo prendere la mano.
    Praticamente il codice che ho postato sopra per la lista è corretto se non centrasse niente il file? E poi in caso fosse corretto come faccio a modificare anche il file e non solo la lista utilizzando l'altro file? E per ordinare la lista il file mi basta aprirlo in "r"?
  • Re: Problema ordinamento in un file [C]

    minomic ha scritto:


    Il codice sopra non l'ho controllato, ma se ti dà un segmentation fault allora sicuramente non è corretto.

    Per modificare il file devi fare come dicevo prima: aprire un secondo file in scrittura, trascrivere quello che vuoi che sia il nuovo contenuto del file, eliminare il vecchio e rinominare il nuovo. Altrimenti è una operazione a senso unico: tu leggi dal file, fai tutti i cambiamenti che vuoi (ordini, inserisci, elimini, ...) ma quando il programma termina, tutti i cambiamenti vanno persi. E questo perché hai solo letto dal file, senza scrivere nulla.
    Ho modificato il codice con i due file ma comunque il problema del segmantation fault, potresti buttarci un occhio? Grazie
    Lista ordina_lista(Lista *p_lista){
    
    	FILE* fp = fopen("lista.txt", "r");
    	FILE *fn = fopen("secondo.txt", "w+");
    
    	Lista *bubble = NULL, *swap = NULL;
    	nodo = *p_lista;
        	if ( !nodo && !nodo->next) 
    		return nodo;
       
        	int scambio;
      	
    	   
        	do
       	{
            	scambio = 0;
    
            	/*il primo è speciale*/
            	if ( nodo->reale > nodo->next->reale )
            	{
                		scambio =! scambio;
                		/*tolgo dalla lista il secondo elemento*/
                		*bubble = nodo->next;
                		nodo->next = (*bubble)->next;
                		/*metto l'elemento tolto in testa alla lista*/
                		(*bubble)->next = nodo;
                		nodo = *bubble;
    			fprintf(fn, "%s %g %g", id, reale, immaginario);
           		}
            	/*tutti gli altri confronto il sucessivo con il sucessivo sucessivo
            	in questo modo non perdo il riferimento al precedente*/
            	for(*bubble = nodo; (*bubble)->next->next; *bubble = (*bubble)->next)
            	{
                		if ( (*bubble)->next->reale > (*bubble)->next->next->reale )
                		{
                    		if ( !scambio ) 
    					scambio =! scambio;
                
                    		/*tolgo dalla lista l'elemento sucessivosucessivo*/
     				*swap = (*bubble)->next->next;
                    		(*bubble)->next->next = (*swap)->next;
                    		/*swappo*/
                    		(*swap)->next = (*bubble)->next;
                    		(*bubble)->next = *swap;
    				fprintf(fn, "%s %g %g", id, reale, immaginario);
                		}       
            	}
        	}while(scambio);
    	fclose(fp);
    	fclose(fn);
    	remove("lista.txt");
    	rename("secondo.txt", "lista.txt");
    
        	return nodo;
    
    }
    
  • Re: Problema ordinamento in un file [C]

    Ma perché non provi ad imparare ad eseguire il codice linea per linea (con un debugger)?

    Risolveresti prima e da solo ...
  • Re: Problema ordinamento in un file [C]

    oregon ha scritto:


    Ma perché non provi ad imparare ad eseguire il codice linea per linea (con un debugger)?

    Risolveresti prima e da solo ...
    ok adesso provo grazie.
  • Re: Problema ordinamento in un file [C]

    ofcar ha scritto:


    oregon ha scritto:


    Ma perché non provi ad imparare ad eseguire il codice linea per linea (con un debugger)?

    Risolveresti prima e da solo ...
    ok adesso provo grazie.
    Ho provato con il debugger ma adesso che mi dice dov'è l'errore non so cosa voglia dire:

    Program received signal SIGSEGV, Segmentation fault.
    0x000000000040114f in ordina_lista (p_lista=0x6020d8 <nodo>) at progetto.c:302
    302 *bubble = nodo->next;
  • Re: Problema ordinamento in un file [C]

    Quel codice che hai postato mi sembra di conoscerlo...
    Io procedere i cosi:
    Apro il file
    Leggo dal file
    Creo un nodo che contiene i dati letti
    Lo inserisco nella lista GIA NELLA GIUSTA POSIZIONE, in questo modo non devo tornare ad riordinarlo.
    Chiudo il file.
    Salvo in un file temporaneo i dati nella lista e controllo che tutto sia andato bene

    Nel tuo codice non mi sembra di vedere nemmeno un fread!o fgets!
    I dati andrebbero poi salvati alla fine dell ordinamento quindi andrebbe eseguito un ciclo dopo aver ordinato la lista.
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Quel codice che hai postato mi sembra di conoscerlo...
    Io procedere i cosi:
    Apro il file
    Leggo dal file
    Creo un nodo che contiene i dati letti
    Lo inserisco nella lista GIA NELLA GIUSTA POSIZIONE, in questo modo non devo tornare ad riordinarlo.
    Chiudo il file.
    Salvo in un file temporaneo i dati nella lista e controllo che tutto sia andato bene

    Nel tuo codice non mi sembra di vedere nemmeno un fread!o fgets!
    I dati andrebbero poi salvati alla fine dell ordinamento quindi andrebbe eseguito un ciclo dopo aver ordinato la lista.
    Allora, quando tu dici "creo un nodo che contiene i dati letti" intendi una lista? Perché come faccio con un solo nodo a contenere tutti i dati che ci sono nel file? E il "Lo inserisco nella lista GIA NELLA GIUSTA POSIZIONE, in questo modo non devo tornare ad riordinarlo." non ho capito cosa intendi io devo ordinare tutti i numeri all'interno del file in base alla parte reale, non devo inserire nuovi numeri in ordine..
  • Re: Problema ordinamento in un file [C]

    Allora faccio un esempio in pseudo codice:
    
    f = openfile(forread);
    
    LOOP:
    
    Nodo n = new();
    
    n.value = read(f);
    if EOF goto SAVE:
    
    if l.value < Lista.value
        l.next = lista
        lista =l
        goto LOOP
    
    for each l in Lista AND ll in Lista.next
        if ( n.value < ll.value )
            n.next = ll
            l.next = n
    
    goto LOOP
    
    SAVE:
    close(f)
    
    f = openfile(forwrite)
    for each l in Lista
        write(f,l.value)
    close(f)
    
    Good Bye
    
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    allora faccio un esempio in pseudo codice:
    
    f = openfile(forread);
    
    LOOP:
    
    Nodo n = new();
    
    n.value = read(f);
    if EOF goto SAVE:
    
    if l.value < Lista.value
        l.next = lista
        lista =l
        goto LOOP
    
    for each l in Lista AND ll in Lista.next
        if ( n.value < ll.value )
            n.next = ll
            l.next = n
    
    goto LOOP
    
    SAVE:
    close(f)
    
    f = openfile(forwrite)
    for each l in Lista
        write(f,l.value)
    close(f)
    
    Good Bye
    
    Nello pseudo codice non capisco un paio di cose:
    n.value = read(f);
    vuol dire che devo leggere il file se cosa? n.value vuol dire il "value" contenuto nel nodo "n"?
    Io per leggere il file uso un ciclo con una fscanf fino a EOF non capisco cosa intendevi..
    if ( n.value < ll.value )
            n.next = ll
    "l" sarebbe la mia lista di numeri giusto? ma cosa sono le doppie l?
    Lista.value
    cos'è?

    grazie e scusa il disturbo..
  • Re: Problema ordinamento in un file [C]

    vuol dire che devo leggere il file se cosa? n.value vuol dire il "value" contenuto nel nodo "n"?
    Io per leggere il file uso un ciclo con una fscanf fino a EOF non capisco cosa intendevi..
    Significa che crei un nuovo nodo e metti il valore letto dalla fscanf dentro al nodo, se ad esempio il nodo ha una variabile int di nome value potrai fare:
    
    ...
    Nodo* n = malloc(sizeof(NODO));
    fscanf(f,"%d",&n->value);
    n->next = NULL;
    ...
    
    Ecco creato un nodo parteno dal valore sul file.
    A questo punto devi inserirlo nella lista al punto giusto.
    Controlli prima che non sia minore della testa(Lista), perchè in quel caso speciale il primo puntatore e quindi quello che referenzia tutta la lista cambia e dunque avrai:
    
    if ( !Lista || n.value < Lista.value )
    {
        n->next = Lista;
        Lista = n;
    }
    
    Controllo anche che Lista non sia Vuota...
    Se invece non è il primo della lista scorri la lista come nel codice indicato e quando lo trovi inserisci

    Ora cicli ricreando un nuovo nodo, fscanf etc...
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    vuol dire che devo leggere il file se cosa? n.value vuol dire il "value" contenuto nel nodo "n"?
    Io per leggere il file uso un ciclo con una fscanf fino a EOF non capisco cosa intendevi..
    Significa che crei un nuovo nodo e metti il valore letto dalla fscanf dentro al nodo, se ad esempio il nodo ha una variabile int di nome value potrai fare:
    
    ...
    Nodo* n = malloc(sizeof(NODO));
    fscanf(f,"%d",&n->value);
    n->next = NULL;
    ...
    
    Ecco creato un nodo parteno dal valore sul file.
    A questo punto devi inserirlo nella lista al punto giusto.
    Controlli prima che non sia minore della testa(Lista), perchè in quel caso speciale il primo puntatore e quindi quello che referenzia tutta la lista cambia e dunque avrai:
    
    if ( !Lista || n.value < Lista.value )
    {
        n->next = Lista;
        Lista = n;
    }
    
    Controllo anche che Lista non sia Vuota...
    Se invece non è il primo della lista scorri la lista come nel codice indicato e quando lo trovi inserisci

    Ora cicli ricreando un nuovo nodo, fscanf etc...
    Ok capito, grazie 1000
Devi accedere o registrarti per scrivere nel forum
39 risposte