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