PDA

Visualizza la versione completa : [C]Lettura di particolari dati da file


Shadi
21-02-2014, 10:32
Salve a tutti, ho un problema con un esercizio di informatica che dovrei fare per prepararmi all'esame.
Dunque il testo dell'esercizio dice: "Sia dato un file contenente dati su località da visitare in un itinerario turistico. Il file è strutturato in modo che ogni riga contenga il nome di una città (una stringa) e un valore intero indicante la posizione della città nell’itinerario. Per es., la riga “Roma 10” indica che Roma è la 10a località prevista nell’itinerario definito nel file.
N.B.: I dati contenuti nel file non sono ordinati. Per esempio, la 5a destinazione potrebbe essere memorizzata nel file prima della 1a destinazione. Il numero di destinazioni memorizzate nel file non è noto a priori."

Io ho provato a fare una lettura con fscanf e salvare i dati in una stringa, ma in questo modo non so come leggere il numero della città per riordinarli nella lista, ho provato a fare una lettura sempre con fscanf tentando di salvare i file su int e nemmeno lì riesco a decodificare il numero... forse mi sfugge qualcosa sui file, mi potete aiutare con questa parte? Il resto dell'esercizio lo so fare ma senza questo punto di partenza non posso fare nemmeno il resto D: grazie in anticipo

oregon
21-02-2014, 11:07
Potrebbe bastare la fscanf leggendo una stringa e un intero

%s %d

ma se le città possono avere più di una parola allora è diverso (ad esempio New York)

Shadi
21-02-2014, 11:49
Ho provato come mi hai detto e forse ho risolto anche il problema di new york.. la fscanf legge tutto fino agli spazi, mentre la fgets legge una lunghezza definita, usando due fscanf il risultato per new york è "New 10" se uso invece un fgets per la stringa e un fscanf per l'intero viene "New york 10" è una cosa che mi è uscita di fortuna o è giusto?

Shadi
21-02-2014, 11:51
Rettifica: se metto un numero di elementi da leggere maggiore di 10 il programma va in crash... io ho scritto così

fp=fopen("C:\\Users\\Giulia\\Desktop\\sdojid.txt", "r");
fgets(nome, 15, fp);
fscanf(fp, "%d", &posizione);

se metto 15 non funziona più

oregon
21-02-2014, 13:18
Prima di continuare con delle prove, chiariamo ... il file può contenere un nome con degli spazi o no?

San Paolo 12
New York 20
San Vittore Olona 23

sono elementi validi?

Shadi
21-02-2014, 15:57
il testo dell'esercizio non specifica nulla a riguardo, ergo si è possibile, a meno che la prof non abbia considerato questa eventualità.. infatti se fossero escluse le città con un nome doppio il problema sarebbe di fatto risolto utilizzando una fscanf con due specifiche di conversione

oregon
21-02-2014, 16:27
Se possono esserci nomi doppio le cose si complicano un po'. Dovrai usare la fgets e leggere tutto in una stringa.
Poi dovrai trovare, a partire da destra, il primo spazio e separare le due parti, trasformando in intero quella a destra e copiando in una stringa quella a sinistra.

Altrimenti una sola fscanf e risolvi.

Shadi
22-02-2014, 18:31
Grazie, allora ho considerato solo i nomi di città con nome singolo.. il resto dell'esercizio dice di creare una funzione che abbia come parametro il nome del file e operi creando una lista dinamica con i nomi delle città ordinati; io ho fatto un tentativo, ma non ho un'idea chiara di come muovermi in questa situazione... nel senso, io ho creato un file con 10 città disordinate ognuna su una riga, non so però come fare in modo che la fscanf legga una città alla volta e trovato il numero giusto lo inserisca nella lista, ho fatto un tentativo ma non funziona

Shadi
22-02-2014, 18:31
cosa ho sbagliato? Nodo CostruisciLista (char NomeFile[100], Nodo lista) { fp=fopen(file, "r"); char CittaCorr[M]; int CittaNum, n=1, indi; if (fp==NULL) { printf("impossibile aprire il file\n"); return lista; } while (indi!=EOF && ncitta.city, CittaCorr); nuovo->citta.posizione=CittaNum; nuovo->next=lista; lista=nuovo; n=n+1;} else rewind(fp); } fclose(fp); return lista; }

oregon
22-02-2014, 20:31
Il codice è illeggibile

Loading