Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C++] Da file a lista

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30

    [C++] Da file a lista

    Salve ragazzi, sto creando un programma molto semplice.
    Ho un elenco dei libri presi in prestito da una biblioteca inserito in una lista, il programma oltre alla gestione della lista di per se deve anche permettere il salvataggio e il caricamento da file.
    Adesso, essendo questa la funzione che salva su file
    void salva_file(struct alunno *t){ p = fopen("file.txt", "w"); while(t != NULL){ fprintf(p, "%s ", (*t).cognome); fprintf(p, "%s \n", (*t).nome); fprintf(p, "%s \n", (*t).titolo); puts((*t).cognome); t = (*t).succ; } puts("\nDati salvati\n"); fclose(p); }

    Come devo effettuare il caricamento da file e salvataggio in una lista?
    Praticamente sul file mi ritrovo i nomi in questo modo:
    Cognome Nome LibroPresoInPrestito

    Come faccio ad assegnare ogni elemento allo specifico sottoelemento della struct?
    lista.cognome = cognome;
    lista.nome = nome;
    ecc.

    Non so come fare perché sono tutti elementi da salvare in variabili differenti.

    Grazie a tutti per l'aiuto

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    225

    Re: [C++] Da file a lista

    Originariamente inviato da Vyse220
    void salva_file(struct alunno *t){ p = fopen("file.txt", "w"); while(t != NULL){ fprintf(p, "%s ", (*t).cognome); fprintf(p, "%s \n", (*t).nome); fprintf(p, "%s \n", (*t).titolo); puts((*t).cognome); t = (*t).succ; } puts("\nDati salvati\n"); fclose(p); }
    Grazie a tutti per l'aiuto
    VVoVe: VVoVe: VVoVe: VVoVe:
    Ma ti pare leggibile sto codice???

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    void salva_file(struct alunno *t) {
    p = fopen("file.txt", "w");
    while(t != NULL){
    fprintf(p, "%s ", (*t).cognome);
    fprintf(p, "%s \n", (*t).nome);
    fprintf(p, "%s \n", (*t).titolo);
    puts((*t).cognome);
    t = (*t).succ; }
    puts("\nDati salvati\n"); fclose(p);
    }

    Avevo già postato il codice correttamente, ma il forum me l'ha messo in quel modo, in ogni modo, qualcuno puo darmi una mano?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Il codice va mostrato tra i tag CODE nel forum (tasto #) in modo che sia leggibile.

    Per il tuo problema, non sai leggere da file (non conosci le istruzioni per leggere da file) oppure il codice per leggere lo hai scritto (hai mostrato solo quello che scrive) e non sai passare i dati letti alla struttura?

    Qual e' questa struttura?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    Io ho provato a scrivere il codice del caricamento, ma non funziona, d'altra parte non so come effettuare il caricamento correttamente in questo caso specifico.
    codice:
    struct alunno* carica(){
    	struct alunno * t;
    	p = fopen("file.txt", "r");
    	int c = 1;
    	char nome[20];
    	char cognome[20];
    	char titolo[30];
    	while (!feof(p))
    	{
    		if(c == 1)
    		{
    			fscanf(p, "%s", nome);
    			c++;
    		}
    		if(c == 2)
    		{
    			fscanf(p, "%s", cognome);
    			c++;
    		}
    		if(c == 3)
    		{
    			fscanf(p, "%s", titolo);
    			t = ins_ord(t, nome, cognome, titolo);
    			c = 1;
    		}
    	}
    	return(t);
    }
    Nel file sono scritti in ordine Nome Cognome TitoloLibro e devo rispettivamente salvarli in 3 variabili diverse per poi portarli sulla lista, ma come si effettua il caricamento in questo modo?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Lo fai in

    t = ins_ord(t, nome, cognome, titolo);

    ?

    E la funzione ins_ord e' quella che devi creare?

    t e' solo un puntatore ... quando allochi la memoria per la struttura (che non hai mostrato)?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    Per evitare di creare confusione adesso posto tutto il codice e spiego meglio.
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    
    FILE *p; 
    
    struct alunno {
    	char nome[20];
    	char cognome[20];
    	char titolo[30];
    	struct alunno * succ;
    };
    
    struct alunno * ins_ord(struct alunno * t, char nome[], char cognome[], char titolo[]){
    	struct alunno * tmp = t;
    	struct alunno * p;
    	p = (struct alunno *) malloc(sizeof(struct alunno));
    	
    	if( tmp == NULL || (strcmp(cognome, (*tmp).cognome) == -1)){
    		strcpy((*p).cognome, cognome);
    		strcpy((*p).nome, nome);
    		strcpy((*p).titolo, titolo);
    		(*p).succ = t;
    		return(p);
    	}
    	else{
    		while((*tmp).succ != NULL)
    		{
    			tmp = (*tmp).succ;
    		}
    		if(strcmp(cognome, (*tmp).cognome) > 0){
    			strcpy((*p).cognome, cognome);
    			strcpy((*p).nome, nome);
    			strcpy((*p).titolo, titolo);
    			(*p).succ = NULL;
    			(*tmp).succ = p;
    			return(t);
    		}
    		else{
    			tmp = t;
    			while(!(strcmp(cognome, (*tmp).cognome) > 0 && strcmp(cognome, (*(*tmp).succ).cognome) < 0))
    				tmp = (*tmp).succ;
    			strcpy((*p).cognome, cognome);
    			strcpy((*p).nome, nome);
    			strcpy((*p).titolo, titolo);
    			(*p).succ = (*tmp).succ;
    			(*tmp).succ = p;
    			return(t);
    		}
    	}
    }
    
    void salva_file(struct alunno *t){
    	p = fopen("file.txt", "w");
    	while(t != NULL){
    		fprintf(p, "%s ", (*t).cognome);
    		fprintf(p, "%s \n", (*t).nome);
    		fprintf(p, "%s \n", (*t).titolo);
    		puts((*t).cognome);
    		t = (*t).succ;
    	}
    	puts("\nDati salvati\n");
    	fclose(p);
    }
    
    struct alunno * cancella(struct alunno * t){
    	char cognome[20];
    	struct alunno* p = t;
    	struct alunno* testa = t;
    	puts("cognome di chi cancellare:");
    	fflush(stdin);
    	gets(cognome);
    	fflush(stdin);
    	t = (*t).succ;
    	while(t != NULL){
    		if(strcmp((*t).cognome, cognome) == 0){
    			(*p).succ = (*t).succ;
    		}
    		p = (*p).succ;
    		t = (*t).succ;
    	}
    	return(testa);
    }
    
    struct alunno* carica(){
    	struct alunno * t;
    	p = fopen("file.txt", "r");
    	int c = 1;
    	char nome[20];
    	char cognome[20];
    	char titolo[30];
    	while (!feof(p))
    	{
    		if(c == 1)
    		{
    			fscanf(p, "%s", nome);
    			c++;
    		}
    		if(c == 2)
    		{
    			fscanf(p, "%s", cognome);
    			c++;
    		}
    		if(c == 3)
    		{
    			fscanf(p, "%s", titolo);
    			t = ins_ord(t, nome, cognome, titolo);
    			c = 1;
    		}
    	}
    	return(t);
    }
    
    void main()
    {
    	int scelta = 9;
    	struct alunno* testa = NULL;
    	char nome [20];
    	char cognome [20];
    	char titolo[30];
    
    	while(scelta > 0)
    	{
    		puts("1) Carica dati da file\n2) Salva dati su file\n3) Inserisci nuovo prestito\n4) Cancella prestito\n0) Esci\n\n");
    		scanf("%d", &scelta);
    
    		if(scelta == 1)
    		{
    			testa = carica();
    		}
    
    		if(scelta == 2)
    		{
    			salva_file(testa);
    		}
    
    		if(scelta == 3)
    		{
    			puts("Inserisci il nome");
    			fflush(stdin);
    			gets(nome);
    			puts("Inserisci il cognome");
    			fflush(stdin);
    			gets(cognome);
    			puts("Inserisci il titolo");
    			fflush(stdin);
    			gets(titolo);
    			testa = ins_ord(testa, nome, cognome, titolo);
    		}
    
    		if(scelta == 4)
    		{
    			testa = cancella(testa);
    		}
    	}
    }
    Questo è tutto il codice, ho una lista e devo prevedere il salvataggio e il caricamento della stessa su/da file.
    Praticamente io ho già creato la funzione di salvataggio e funziona (è abbastanza semplice in fondo), ma non ho idea di come fare il caricamento, perché sul file gli elementi si presentano in questo modo:
    Nome Cognome Libro
    Nome1 Cognome1 Libro1
    Nome2 Cognome2 Libro2
    ecc..

    E non so come fare perché fossero tutti la stessa cosa metterei uno fscanf fino alla fine del file e salverei da qualche parte ogni volta che si ripete il ciclo, mentre io dovrei fare che la prima volta prende il nome, la seconda il cognome e la terza il libro e così a ripetersi fino alla fine del file.
    Il codice che ho scritto io non funziona.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da Vyse220
    Per evitare di creare confusione adesso posto tutto il codice e spiego meglio.
    Bene ...

    Io ti consiglierei di modificare la funzione in questo modo

    codice:
    struct alunno* carica()
    {
       struct alunno * t;
       FILE *p = fopen("file.txt", "r");
       
       char nome[20];
       char cognome[20];
       char titolo[30];
    
       fscanf(p, "%s %s %s", nome, cognome, titolo);
       while (!feof(p))
       {
          t = ins_ord(t, nome, cognome, titolo);
          fscanf(p, "%s %s %s", nome, cognome, titolo);
       }
    
       fclose(f);
    
       return(t);
    }
    Usa un handle locale per il file e chiudilo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    Originariamente inviato da oregon
    Bene ...

    Io ti consiglierei di modificare la funzione in questo modo

    codice:
    struct alunno* carica()
    {
       struct alunno * t;
       FILE *p = fopen("file.txt", "r");
       
       char nome[20];
       char cognome[20];
       char titolo[30];
    
       fscanf(p, "%s %s %s", nome, cognome, titolo);
       while (!feof(p))
       {
          t = ins_ord(t, nome, cognome, titolo);
          fscanf(p, "%s %s %s", nome, cognome, titolo);
       }
    
       fclose(f);
    
       return(t);
    }
    Usa un handle locale per il file e chiudilo.
    Grazie mille, non avevo pensato a questa soluzione così semplice
    Non ricordavo l'utilizzo di fscanf in questo modo (in realtà non lo sapevo, studio c a scuola e non l'ho mai usato così oO)

    Grazie ancora, porteste anche aiutarmi per la cancellazione di un elemento dalla lista per nome?
    Dovrei fare una cancellazione in testa se l'elemento è all' inizio, in coda se è alla fine e se si trova in mezzo?
    Utilizzo due puntatori?

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    Anche questa soluzione non funziona, non so perché mi da errore, potreste provare voi per piacere?
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    
    FILE *p; 
    
    struct alunno {
    	char nome[20];
    	char cognome[20];
    	char titolo[30];
    	struct alunno * succ;
    };
    
    struct alunno * ins_ord(struct alunno * t, char nome[], char cognome[], char titolo[]){
    	struct alunno * tmp = t;
    	struct alunno * p;
    	p = (struct alunno *) malloc(sizeof(struct alunno));
    	
    	if( tmp == NULL || (strcmp(cognome, (*tmp).cognome) == -1)){
    		strcpy((*p).cognome, cognome);
    		strcpy((*p).nome, nome);
    		strcpy((*p).titolo, titolo);
    		(*p).succ = t;
    		return(p);
    	}
    	else{
    		while((*tmp).succ != NULL)
    		{
    			tmp = (*tmp).succ;
    		}
    		if(strcmp(cognome, (*tmp).cognome) > 0){
    			strcpy((*p).cognome, cognome);
    			strcpy((*p).nome, nome);
    			strcpy((*p).titolo, titolo);
    			(*p).succ = NULL;
    			(*tmp).succ = p;
    			return(t);
    		}
    		else{
    			tmp = t;
    			while(!(strcmp(cognome, (*tmp).cognome) > 0 && strcmp(cognome, (*(*tmp).succ).cognome) < 0))
    				tmp = (*tmp).succ;
    			strcpy((*p).cognome, cognome);
    			strcpy((*p).nome, nome);
    			strcpy((*p).titolo, titolo);
    			(*p).succ = (*tmp).succ;
    			(*tmp).succ = p;
    			return(t);
    		}
    	}
    }
    
    void salva_file(struct alunno *t){
    	p = fopen("file.txt", "w");
    	while(t != NULL){
    		fprintf(p, "%s ", (*t).cognome);
    		fprintf(p, "%s ", (*t).nome);
    		fprintf(p, "%s \n", (*t).titolo);
    		puts((*t).cognome);
    		t = (*t).succ;
    	}
    	puts("\nDati salvati\n");
    	fclose(p);
    }
    
    struct alunno * cancella(struct alunno * t){
    	char cognome[20];
    	struct alunno* p = t;
    	struct alunno* testa = t;
    	puts("cognome di chi cancellare:");
    	fflush(stdin);
    	gets(cognome);
    	fflush(stdin);
    	t = (*t).succ;
    	while(t != NULL){
    		if(strcmp((*t).cognome, cognome) == 0){
    			(*p).succ = (*t).succ;
    		}
    		p = (*p).succ;
    		t = (*t).succ;
    	}
    	return(testa);
    }
    
    struct alunno* carica()
    {
       struct alunno * t;
       p = fopen("file.txt", "r");
       
       char nome[20];
       char cognome[20];
       char titolo[30];
    
       fscanf(p, "%s %s %s", cognome, nome, titolo);
       while (!feof(p))
       {
          t = ins_ord(t, nome, cognome, titolo);
          fscanf(p, "%s %s %s", nome, cognome, titolo);
       }
       fclose(p);
       return(t);
    }
    
    void main()
    {
    	int scelta = 9;
    	struct alunno* testa = NULL;
    	char nome [20];
    	char cognome [20];
    	char titolo[30];
    
    	while(scelta > 0)
    	{
    		puts("1) Carica dati da file\n2) Salva dati su file\n3) Inserisci nuovo prestito\n4) Cancella prestito\n0) Esci\n\n");
    		scanf("%d", &scelta);
    
    		if(scelta == 1)
    		{
    			testa = carica();
    		}
    
    		if(scelta == 2)
    		{
    			salva_file(testa);
    		}
    
    		if(scelta == 3)
    		{
    			puts("Inserisci il nome");
    			fflush(stdin);
    			gets(nome);
    			puts("Inserisci il cognome");
    			fflush(stdin);
    			gets(cognome);
    			puts("Inserisci il titolo");
    			fflush(stdin);
    			gets(titolo);
    			testa = ins_ord(testa, nome, cognome, titolo);
    		}
    
    		if(scelta == 4)
    		{
    			testa = cancella(testa);
    		}
    	}
    }

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 © 2024 vBulletin Solutions, Inc. All rights reserved.