PROBLEMA Linguaggio C - Come Leggo Questo File?

Hell.Boy.Teih

Nuovo Utente
64
4
Ragazzi, sto uscendo di testa. Vi posto un esercizio che mi è stato assegnato sul linguaggio C. Mi interessa sapere come leggere il file impostato nel modo che vedrete... Matrici? Mettetemi sulla buona strada grazie. Inoltre, che differenza c'è tra %c e %s ? Quando usare l'uno e quando l'altro.

Da un lato ci sono le città e dall'altro le temperature settimanali. Così è impostato:

Napoli 12 13 15 14 12 18 17
Milano 10 9 5 11 4 5 3
Bergamo 12 11 12 12 11 10 12

avevo provato senza strutture nel seguente modo:

....dopo aver aperto il file....
C:
char nomi_citta[64];
int temp_citta[64];
int i=0;
while (!feof(punt)){
   fscanf(punt, "%c %d", &(nomi_citta[I]), &(temp_citta[I]);
   i++;
}
 
Ultima modifica da un moderatore:

movlw

Nuovo Utente
32
6
CPU
AMD A4 5300
Dissipatore
Default
Scheda Madre
AsRock DG3+
HDD
Toshiba 500GB
RAM
Kingstone 8GB DDR3
GPU
APU HD7480D
Monitor
Benq FP71G+
PSU
ITEK
OS
Windows 10 64bit
Al posto di fscanf usa fgets, ottieni i vari elementi con strtok e salva tutto in un array di struct così composta:
Codice:
typedef struct
{
    char city[NAME_MAX];
    int temp[DAYS];
}
weather_stats;
 

Nico911

Utente Attivo
192
13
Non ho ben capito cosa devi farci se devi solo memorizzarle o ci devi fare altro successivamente, poi, sai a priori la dimenzione? o il programma deve funzionare anche con elenchi che mantengano la stessa sintassi ma più/meno città?
Io creerei una struttura per ogni città atta a mantenere le sue temperature.

struct temperatura_cittá{
char name[15];
int temperatura[7];
};

A questo punto estrarrei riga per riga utilizzando fscanf come fai già ( però tu non tieni conto che ci sono 7 temperature, ne prendi solo una devi estrarre 7 int prima di prendere la stringa successiva) .
La differenza tra %c e %s è che col primo prendi solo un carattere diverso dallo spazio col secondo (utilizzando fscanf che fa una lettura formattata) prendi tutti i caratteri fino allo spazio e ci crea una stringa(aggiunge /0 alla fine)
Io eviterei di utilizzare metodi non formattati(fgets) e poi fare una split del tutto ti rende resti inutilmente complesso un problema banale

Infine per il mantenimento se la dim è fissa fai un array delle strutture se variabile io opterei per una lista aggiungendo un puntatore nella struttura.

struct temperatura_città elenco[3];

O per dinamica,

(Aggiungo struct temperatura_città *next; nella struttura di prima)

struct temperatura_città *elenco=NULL; //PUNTO DI PARTENZA PER CREARE LA LISTA
 
Ultima modifica:

movlw

Nuovo Utente
32
6
CPU
AMD A4 5300
Dissipatore
Default
Scheda Madre
AsRock DG3+
HDD
Toshiba 500GB
RAM
Kingstone 8GB DDR3
GPU
APU HD7480D
Monitor
Benq FP71G+
PSU
ITEK
OS
Windows 10 64bit
Dipende da cosa si vuole realizzare: se si vuole risolvere l'esercizio a livello scolastico o universitario anche fscanf può andare bene insieme alle liste e tutte queste amenità. Se invece si intende scrivere qualcosa di robusto e sensato che supera le due nozioncine di base che si apprendono all'ITIS o al corso di Fondamenti di Informatica in Università allora è bene dimenticarsi di malloc(), free(), liste, scanf e altre funzioni che vanno smaltite nell'umido. Già i problemi di sicurezza che fscanf (e tutta la famiglia) si porta dietro, costituiscono un motivo sufficiente per evitarne l'uso, senza considerare le altre problematiche!
 

Nico911

Utente Attivo
192
13
Non c'è bisogno di arrabbiarsi e qua di esercizietto stiamo parlando. Poi che la fscanf sia una funzione problematica è fuori dubbio ma insicura io aggiungerei che dipende molto da chi la usa e dal contesto. I problemi della fscanf sono tutti noti e aggiungerei che basta un minimo di attenzione per evitarli.
In un contesto del genere con dati semplici e noti io non ce ne vedo di problemi, file preformattato, stringhe definite e spaziate, immagino che l'EOF sia inserito visto che il file è un compitino, quindi scusami ma dove è il problema per cui dovrebbe prendersi tutta la stringa, dividerla, identificare i nomi e convertirli in stringhe e convertire i caratteri da considerare numeri , infine memorizzarli VS li prendo e li memorizzo

Dici cose giuste ma io personalmente trovo un grosso e comun sbaglio complicare un programma per nulla, non sei bravo se usi funzioni a manetta e scegli la via più complessa per risolvere qualcosa, il bravo programmatore è quello che sa creare programmi con una complessità adeguata al compito, in questo caso la mia soluzione ha una complessitá algoritmica che è meno della metà della tua a dimostrazione che sarà una soluzione banale ma è migliore di una che fa uso di funzioni più complesse e macchinose(in questo caso con questo esercizio sia chiaro in un altro contesto avresti ragione tu e io non ne avrei consigliato il suo uso).

Comunque sia sono quasi un laureato di ing informatica non uno studente itis o del primo anno e le liste aggiungere le ho usate nel mio progetto d'esame di sviluppo di un modulo kernel linux e ora le riuso per sviluppare alcune componenti di un server di rete che devo portare come progetto a gennaio(e ci ho pensato parecchio su quale strutture utilizzare per ogni componente), segno che forse non sono così 'amenitá' e anzi sono presenti anche nelle strutture dati del sistema operativo quindi forse fanno anche comodo, sempre aggiungendo,che uno sappia i vantaggi che porta usare una lista invece di un array o di un albero o di quello che vuoi
 
Ultima modifica:

movlw

Nuovo Utente
32
6
CPU
AMD A4 5300
Dissipatore
Default
Scheda Madre
AsRock DG3+
HDD
Toshiba 500GB
RAM
Kingstone 8GB DDR3
GPU
APU HD7480D
Monitor
Benq FP71G+
PSU
ITEK
OS
Windows 10 64bit
Sotto sotto fscanf farà comunque il parsing dell'input, quindi tanto vale farlo esplicitamente e controllare tutto direttamente. Se uno presta attenzione, può scrivere un semplice modulo per l'I/O che potrà riutilizzare per tutti gli esami (o verifiche se OP è alle superiori) : la "complicazione", se così si può chiamare, si ha solo la prima volta se il modulo viene ben progettato.
Secondo la mia opinione quando si studia bisogna farlo al meglio, indipendentemente dal proprio livello perché accontentandosi di riuscire a scrivere qualcosa che "Wow compila" non si progredisce di molto.
Il fatto che tu sia quasi laureato e che ti sia capitato di usare le liste non significa molto: significa solo che all'Università l'uso delle liste è permesso. In contesti più "seri", non che l'Università non sia seria, vedrai che le liste e cose simili non vengono usate se non dopo notti e notti insonni a caccia di soluzioni alternative. Detto questo, è bene attendere una risposta di OP ed eventualmente continuare pacificamente questa digressione in privato onde evitare di sfociare in un OT.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili