Salvare elementi da file in lista c

di il
2 risposte

Salvare elementi da file in lista c

Buona sera, avrei bisogno del vostro aiuto per un problema apparentemente semplice ma che mi sta mandando veramente in crisi.
Avrei bisogno di salvare in una lista dei dati estratti da un file e poi stampare questa lista di oggetti.
Ho fatto varie prove ma non riesco proprio a farlo funzionare decentemente. Vi vorrei pubblicare due versioni differenti che ho scritto, entrambe compilano ma una mi mette in lista solo l'ultimo record, mentre l'altro nessuno.
il file da cui estrarre i dati è un file .csv così composto:
tavolo, 1.4, 8.6
lampada, 5.6, 8.2
Mentre questo è il mio primo codice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stanza {
    char nome[50]; 
    double x;
    double y; 
    struct stanza *next;
}; 



int gestisciMenu() {
	int numero;
	printf("\n 1 Leggere da lista gli oggetti da file\n 2 Stampa\n 3 Rimuovi\n 4 Stampa distanza\n 5 Ordina\n 6 Esci\n");
    printf("Immetti una scelta: ");
	scanf("%d", &numero); 
    printf("\n");
	return numero;
}

void pulisciVirgole (char * stringa) {
        int i = 0;
        int scrittura = 0;
        while (stringa[i] != '\0') {
                //salto gli spazi non entrando in if
                if (stringa[i] != (',')){
                        stringa[scrittura] = stringa[i];
                        scrittura++;
                }
                i++;
        }
        stringa[scrittura] = '\0';
}

struct stanza *creaNuovo() {
	
	FILE *p; 
	char nome[50];
	char coord1[10],coord2[10];
	struct stanza *elemento = NULL;

    double x,y;
    char *endPtr;

	if ((p = fopen("oggetti.csv", "r"))==NULL) {
		printf("il file non esiste!\n");
	}
	else {
		while (!feof(p)) {
			fscanf(p, "%s %s %s", nome, coord1, coord2);
            pulisciVirgole(nome);
            pulisciVirgole(coord1);
            pulisciVirgole(coord2);
            x = strtod(coord1, &endPtr);
            y = strtod(coord2, &endPtr);
            elemento = malloc(sizeof(struct stanza));
			strncpy(elemento->nome, nome, 50); 
			elemento-> x = x;
			elemento-> y = y;
            //elemento=elemento->next;
		}
	}
    fclose(p);
    return elemento;
}

void aggiungiElemento(struct stanza **head, struct stanza *elemento){

    //nodo usato per attraversare la lista
    struct stanza *prec = NULL;
    elemento->next = NULL;

    //se lista vuota
    if(*head == NULL){
        *head = elemento;
    }
    //aggiungo in coda
    else{
		prec = *head;
        while(prec->next) 
            prec = prec->next;
            prec->next = elemento;
    }
}

void gestisciAggiunta(struct stanza **head) {
    struct stanza *nuovo = creaNuovo(); 
    aggiungiElemento(head,nuovo);
}

int stampaLista(struct stanza *head){
    int i = 1;
    printf("ID nome\t\tx\t y\n");
    while(head != NULL){
        printf("%d. %s\t%.2lf\t%.2lf\n", i, head->nome, head->x, head->y);
        head = head->next;
        i++;
    }
    return i;
}

int main() {
	struct stanza *head = NULL;

	while (1) {
		int menu = gestisciMenu(); 
			switch (menu) {
				case 1:
					gestisciAggiunta(&head);  	
					break; 
				case 2:
					stampaLista(head);
					break;
				case 3: 
				//rimuoviOggetto(&head); 
				case 4: 
				//stampaDistanza(&head); 
				//case 5:
				//ordinamento(&head); 
				case 6: 
					exit(EXIT_SUCCESS); 
				default: 
					printf("comando non trovato!\n"); 
		}
	}
}
questo il secondo più ordinato ma non mi funziona proprio la lista
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stanza {
    char nome[50]; 
    double x;
    double y; 
    struct stanza *next;
}; 


int gestisciMenu() {
	int numero;
	printf("\n1 Leggere da lista gli oggetti da file\n 2 Stampa\n 3 Rimuovi\n 4 Stampa distanza\n 5 Ordina\n 6 Esci\n"); 
	scanf("%d", &numero); 
	return numero;
}

void aggiungiElemento(struct stanza **head, struct stanza *elemento){

    //nodo usato per attraversare la lista
    struct stanza *prec = NULL;
    elemento->next = NULL;

    //se lista vuota
    if(*head == NULL){
        *head = elemento;
    }
    //aggiungo in coda
    else{
		prec = *head;
        while(prec->next) 
            prec = prec->next;
            prec->next = elemento;
    }
}

void pulisciVirgole (char * stringa) {
    int i = 0;
    int scrittura = 0;
    while (stringa[i] != '\0') {
        //salto gli spazi non entrando in if
        if (stringa[i] != (',')){
            stringa[scrittura] = stringa[i];
            scrittura++;
        }
        i++;
    }
    stringa[scrittura] = '\0';
}

struct stanza *creaNuovo(char *nome, double x, double y) {

    struct stanza *elemento = NULL;
    elemento = malloc(sizeof(struct stanza)); //Alloco memoria dinamica per la struct

    strncpy(elemento->nome, nome, 50); 
	elemento-> x = x; 
	elemento-> y = y;

    return elemento;
}

void lista(struct stanza *head) {
	
	FILE *p; 
	char nome[50];
	char coord1[10],coord2[10];

    double x,y;
    char *endPtr;

	if ((p = fopen("oggetti.csv", "r"))==NULL) {
		printf("il file non esiste!\n");
	}
	else {
		while (!feof(p)) {
			fscanf(p, "%s %s %s", nome, coord1, coord2);
            pulisciVirgole(nome);
            pulisciVirgole(coord1);
            pulisciVirgole(coord2);
            x = strtod(coord1, &endPtr);
            y = strtod(coord2, &endPtr);
            printf("%s %.2lf %.2lf\n", nome, x, y);
            struct stanza *nuovo = creaNuovo(nome, x, y); 
	        aggiungiElemento(&head,nuovo); 
		}
	}
    fclose(p);
}

/*
void gestisciAggiunta(struct stanza **head) {
	struct stanza *nuovo = creaNuovo(); 
	aggiungiElemento(head,nuovo); 
}
*/


int stampaLista(struct stanza *head){
    int i = 1;
    printf("ID nome\t x\t y\n");
    while(head != NULL){
        printf("%d. %s \t%.2lf\t%.2lf\n", i, head->nome, head->x, head->y);
        head = head->next;
        i++;
    }
    return i;
}

int main() {
	struct stanza *head = NULL;

	while (1) {
		int menu = gestisciMenu(); 
			switch (menu) {
				case 1:
					lista(head);  	
					break; 
				case 2:
					stampaLista(head);
					break;
				case 3: 
				//rimuoviOggetto(&head); 
				case 4: 
				//stampaDistanza(&head); 
				//case 5:
				//ordinamento(&head); 
				case 6: 
					exit(EXIT_SUCCESS); 
				default: 
					printf("comando non trovato!\n"); 
		}
	}
}
Grazie a chiunque abbia voglia di leggere questi papiri di codice

2 Risposte

  • Re: Salvare elementi da file in lista c

    Nel secondo codice devi passare un doppio puntatore in

    void lista(struct stanza **head) {

    altrimenti non sarà modificato, di conseguenza sarà

    aggiungiElemento(head,nuovo);

    e nel main

    lista(&head);

    Il primo codice ha molti errori, il principale la lettura da file dei singoli elementi che NON vengono aggiunti alla lista.
  • Re: Salvare elementi da file in lista c

    oregon ha scritto:


    Nel secondo codice devi passare un doppio puntatore in

    void lista(struct stanza **head) {

    altrimenti non sarà modificato, di conseguenza sarà

    aggiungiElemento(head,nuovo);

    e nel main

    lista(&head);

    Il primo codice ha molti errori, il principale la lettura da file dei singoli elementi che NON vengono aggiunti alla lista.
    Ti ringrazio infinitamente
    Il primo codice era una bozza che ho scritto alle 2 di notte, mentre il secondo era appunto il codice più ordinato ma mi ero perso per strada un puntatore. Grazie ancora
Devi accedere o registrarti per scrivere nel forum
2 risposte