Problema rimozione elemento da lista [C]

di il
35 risposte

35 Risposte - Pagina 3

  • Re: Problema rimozione elemento da lista [C]

    minomic ha scritto:


    Per eliminare e rinominare ci sono le funzioni rename e remove. Ad esempio
    
        remove("primo.txt");
        rename("secondo.txt", "primo.txt");
    
    Per stampare tutte le righe ti servirà un while.

    Grazie per le funzioni;
    per il while ci avevo pensato ma mi stampa solo una riga comunque..
    Non so dove e come mettere quel while.
  • Re: Problema rimozione elemento da lista [C]

    Ti posto un codice che avevo scritto qualche tempo fa, sempre per un thread sul forum.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        FILE* fp_1 = fopen("primo.txt", "r");
        FILE* fp_2 = fopen("secondo.txt", "w");
        int riga_eliminare, conta_righe;
        size_t lungh = 0;
        ssize_t letti;
        char* line = NULL;
    
        printf("Quale riga vuoi eliminare? ");
        scanf("%d", &riga_eliminare);
        riga_eliminare--;   // cosi' conto da zero
    
        conta_righe = 0;
    
        while ((letti = getline(&line, &lungh, fp_1)) != -1) {
            if(conta_righe++ != riga_eliminare) {
                printf("%s", line);     // si puo' anche eliminare
                fprintf(fp_2, "%s", line);    // ricopio la riga
            }
        }
    
        fclose(fp_1);
        fclose(fp_2);
    
        remove("primo.txt");
        rename("secondo.txt", "primo.txt");
    
        return 0;
    }
    
    Qui si eliminava una riga in base alla sua posizione (la prima, la seconda, ecc.) ma lo puoi facilmente adattare alle tue esigenze.
  • Re: Problema rimozione elemento da lista [C]

    minomic ha scritto:


    Ti posto un codice che avevo scritto qualche tempo fa, sempre per un thread sul forum.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        FILE* fp_1 = fopen("primo.txt", "r");
        FILE* fp_2 = fopen("secondo.txt", "w");
        int riga_eliminare, conta_righe;
        size_t lungh = 0;
        ssize_t letti;
        char* line = NULL;
    
        printf("Quale riga vuoi eliminare? ");
        scanf("%d", &riga_eliminare);
        riga_eliminare--;   // cosi' conto da zero
    
        conta_righe = 0;
    
        while ((letti = getline(&line, &lungh, fp_1)) != -1) {
            if(conta_righe++ != riga_eliminare) {
                printf("%s", line);     // si puo' anche eliminare
                fprintf(fp_2, "%s", line);    // ricopio la riga
            }
        }
    
        fclose(fp_1);
        fclose(fp_2);
    
        remove("primo.txt");
        rename("secondo.txt", "primo.txt");
    
        return 0;
    }
    
    Qui si eliminava una riga in base alla sua posizione (la prima, la seconda, ecc.) ma lo puoi facilmente adattare alle tue esigenze.
    Sono riuscito a farlo finalmente solo che adesso ho un problema se la riga da cancellare è la prima o l'ultima non la cancella e ne cancella un'altra random, posto il codice sotto:
    Lista elimina_valore(Lista L) {
    	
    	/*apro i file*/
    	FILE* fp = fopen("lista.txt", "r");
        	FILE* fn = fopen("secondo.txt", "w+");
    	
    	/*acquisisco il valore del numero da cancellare*/
        	printf("Inserisci il numero da cancellare\n");
        	scanf("%s %lg %lg", id, &reale, &immaginario);    
    	
    	/*ciclo acquisendo i valori fino alla fine del file*/
        	while ((fscanf(fp, "%s %lg %lg", id, &reale, &immaginario) != EOF )) {
    		/*controllo se i valori inseriti sono diversi da quelli del file*/
            	if((strcmp(nodo->next->id, id) != 0) || (nodo->next->reale != reale) || (nodo->next->immaginario != immaginario)) {
                		fprintf(fn, "%s %g %g\n", id, reale, immaginario);       /*stampo i valori sul secondo file 
    										   tranne quello insertito da tastiera*/							}	
        	}
    	/*chiudo i file aperti*/
    	fclose(fp);
    	fclose(fn);
    
    	remove("lista.txt");						/*elimino il primo file*/
    	rename("secondo.txt", "lista.txt");				/*rinomino il secondo file con il nome del primo*/
    
    	return 0;
    }
    
  • Re: Problema rimozione elemento da lista [C]

    ofcar ha scritto:


    ho un problema se la riga da cancellare è la prima o l'ultima non la cancella e ne cancella un'altra random
    Può benissimo essere che ci fosse un qualche errore nel codice che ti ho postato... Adesso non ho tempo di verificarlo ma appena posso lo provo e ti faccio sapere.
  • Re: Problema rimozione elemento da lista [C]

    minomic ha scritto:


    ofcar ha scritto:


    ho un problema se la riga da cancellare è la prima o l'ultima non la cancella e ne cancella un'altra random
    Può benissimo essere che ci fosse un qualche errore nel codice che ti ho postato... Adesso non ho tempo di verificarlo ma appena posso lo provo e ti faccio sapere.
    Ok grazie intanto ci butto un occhio anche io se risolvo ti scrivo qua

    Ho notato anche che se nel confronto uso gli "or" mi cancella l'elemento successivo a quell che inserisco, ma se due elementi hanno id uguale non mi svuota completamente il file. Mentre se uso gli "and" mi cancella quello coretto ma se inserisco un numero che ha ad esempio l'id uguale a uno già presente nel file mi cancella tutto il file.
  • Re: Problema rimozione elemento da lista [C]

    minomic ha scritto:


    ofcar ha scritto:


    ho un problema se la riga da cancellare è la prima o l'ultima non la cancella e ne cancella un'altra random
    Può benissimo essere che ci fosse un qualche errore nel codice che ti ho postato... Adesso non ho tempo di verificarlo ma appena posso lo provo e ti faccio sapere.
    Per risolvere il problema dell'eliminazione del primo elemento avevo pensato di fare un controllo su tutti gli elementi presenti nel file, nel caso il numero inserito non fosse presente nel file do un messaggio di errore; mentre se il numero inserito fosse presente nel file ma non fosse nessuno di quelli che lui riesce a leggere, allora faccio partire la copia dal secondo elemento..
    è molto complicato come ragionamento, e non so se è realizzabile. Secondo te? E' fattibile?
Devi accedere o registrarti per scrivere nel forum
35 risposte