Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Abbiamo provato Google Pixel 11, il più accessibile della nuova gamma: chip Tensor G6 condiviso con i modelli Pro, fotocamera 48 MP con Magic Capture e Stili Fotografici, display Actua da 3000 nit e batteria da 4985 mAh. Ecco come si comporta nell'uso quotidiano, e cosa cambia davvero rispetto a Pixel 11 Pro e Pro XL
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL debutta in Italia con il nuovo Tensor G6, lo Zoom Pro fino a 120x, il display Super Actua da 3600 nit e la new entry HiLight riservata ai modelli Pro: lo abbiamo provato in anteprima per diversi giorni prima del lancio commerciale, tra fotocamera generativa, ricarica ancora indietro rispetto ai rivali e un prezzo che parte da 1399 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-02-2014, 13:55   #1
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
[C] Lettura sequenziale di un file

Salve a tutti, dovrei togliermi questo dubbio definitivamente per andare tranquilla all'esame che ho tra due giorni;
Io ho un file ad esempio così:
Roma 10
Pechino 2
Milano 7
ecc

con i nomi delle città (non è scritto da nessuna parte che non possano essere nomi formati da due parole) e io devo scrivere una lista mettendoli in ordine di numero... che funzione devo usare? ma soprattutto come la devo usare? io ho provato con un fscanf in questo modo

codice:


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!=10 && n<=10) {
indi=fscanf(fp, "%s%d", CittaCorr, &CittaNum);
if (CittaNum=n) {
Nodo nuovo;
nuovo=malloc(sizeof(Lista));
strcpy(nuovo->citta.city, CittaCorr);
nuovo->citta.posizione=CittaNum;
nuovo->next=lista;
lista=nuovo;
n=n+1;}


}
fclose(fp);
return lista;
}

senza successo.. come si legge in modo sequenziale da file? Anche dando importanza al tipo di dato che può interessarci? Grazie in anticipo
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 14:45   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Prima di tutto metti il programma nei tag code, altrimenti è difficile da leggere anche se di poche righe.

Poi, ti è stato detto che nel file ci sono sempre esattamente 10 righe?

Per separare il numero dalla città ti consiglio di leggere l'intera riga in una stringa e poi dividerla con questa funzione:
http://infocenter.arm.com/help/index...66_strrpos.htm

PS. per leggere una riga di testo da un file io trovo molto comoda questa funzione qui:
http://digilander.libero.it/uzappi/C...oni/fgets.html

Ultima modifica di Daniels118 : 26-02-2014 alle 14:48.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 15:34   #3
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
il fatto è che questo è un esercizio tra 6 che devo fare in due ore.. usare l'fgets e separare le due cose è un processo abbastanza lungo, non so a priori che siano 10, infatti li si pone un altro problema perchè non so come fare-.-
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 15:46   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Definire un "processo abbastanza lungo" 3 (tre) righe di codice mi sembra quanto meno un'iperbole.

Non voglio credere che ti facciano fare un esame senza nemmeno averti spiegato come si legge un file... si usa sempre questo criterio:
1) si legge la prima riga
2) se la lettura è andata male si va al punto 6
3) si elabora la riga letta
4) si legge una nuova riga
5) si va al punto 2
6) fine.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 16:13   #5
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
mi hanno insegnato solamente come leggere una riga sola. Purtroppo la prof è incompetente e non poco e se 2/3 dei suoi alunni non passano l'esame un motivo c'è.. il processo in sè l'ho capito per come l'hai descritto, non ho capito come farlo effettivamente nel senso nel ciclo che condizione metto affinchè legga tutte le righe e verifichi la presenza o meno di un certo elemento
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 16:16   #6
gianmpu
Senior Member
 
Iscritto dal: Oct 2010
Messaggi: 1609
Nel codice che hai postato c'è un errore concettuale. Infatti il ciclo while prevede una condizione sulla variabile indi che però non viene inizializzata.
Anche se il valore contenuto in indi, essendo casuale, è diverso da 10 ed entri lo stesso nel while la prima volta, dovresti darle comunque un valore.
Per risolvere, dopo aver testato l'esistenza del file con fopen, potresti usare invece del while un ciclo do while che secondo me si adatterebbe meglio all'algoritmo che ti ha proposto Daniels118

Edit: leggendo meglio il codice che hai postato, non mi sembra che tu risolva quello che ti è stato chiesto perchè tu inserisci la città subito in un nuovo Nodo mentre, se non ho capito male, devi fare un inserimento mantenendo l'ordine del numero associato alla città. Per fare questo hai due possibili scelte:
1) Prima di inserire la città nella lista scorri la lista stessa alla ricerca del punto corretto in cui mettere la nuova città
2) Crei tutta la lista e alla fine la ordini

Ultima modifica di gianmpu : 26-02-2014 alle 16:34.
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 16:31   #7
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
mhh provo
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 17:15   #8
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
ah io il parziale l'ho passato ahah quindi non son tra di loro, e per quanto riguarda i libri si ci sono, ma fanno esempi banali che a poco servono.-. (e nessuno dei due parla di lettura di più righe)
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 17:17   #9
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
Quote:
Originariamente inviato da gianmpu Guarda i messaggi
Edit: leggendo meglio il codice che hai postato, non mi sembra che tu risolva quello che ti è stato chiesto perchè tu inserisci la città subito in un nuovo Nodo mentre, se non ho capito male, devi fare un inserimento mantenendo l'ordine del numero associato alla città. Per fare questo hai due possibili scelte:
1) Prima di inserire la città nella lista scorri la lista stessa alla ricerca del punto corretto in cui mettere la nuova città
2) Crei tutta la lista e alla fine la ordini
è proprio quello il problema.-.
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 18:58   #10
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Quale problema?

Hai due soluzioni davanti. Quale non sai realizzare?
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 19:00   #11
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La programmazione non è recitazione, devi imparare a risolvere i problemi da sola, non a memoria.
Ora, capisco che il primo impatto possa essere un po' duro, quindi chiedere aiuto non è una cosa cattiva, ma non sapere quasi nulla a 2 giorni dall'esame non è bello, fossi in te prenderei in considerazione la scelta di rinviarlo.

Detto questo siamo a disposizione per aiutare.

Ti traduco l'algoritmo che ho postato prima in pseudocodice:
Codice:
file = apri(nome_file)
riga = leggi_riga(file)
while (not end_of_file(file)) {
  elabora(riga)
  riga = leggi_riga(file)
}
chiudi(file)
Le rispettive funzioni in c, in ordine di apparizione, sono queste: fopen, fgets, feof, fclose.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2014, 22:02   #12
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
Non è che non so fare nulla.. Sugli altri argomenti son messa bene, è solo questo con cui non vado d'accordo. Comunque grazie per le vostre risposte, mi mancava solo la condizione del while ora ho capito. Domani lo provo
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 07:31   #13
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Non dimenticarti che oltre alla lettura devi occuparti anche dell'ordinamento, come ti è stato già suggerito i metodi sono due, o un ordinamento a posteriori (puoi sceglierne uno qualunque), oppure inserire gli elementi già al posto giusto (ordinamento per inserimento).
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 08:27   #14
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
Ma per quello non c'è problema.. Posso salvare tutto in una lista dove son tutti disordinati e poi riordinarli, il problema stava solo nella lettura
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 15:11   #15
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
Eccomi qui, dunque, ho messo assieme tutti i vostri consigli e n'è saltato fuori questo frammento di programma; in questo caso sto salvando tutto in una lista a random con inserimento in testa e poi ordinerò in seguito gli elementi; è giusto?

Codice:
fp=fopen("C:\\Users\\Giulia\\Desktop\\itinerario.txt", "r");
    if (fp==NULL) {
        printf("impossibile aprire il file\n");
        return -1
        }
    else {
            do {
                    fgets(stringa, M, fp);
                    spazio=strrpos(stringa, ' ');
                    int i;
                    for (i=0; i<spazio; i++) {
                        citta[i]=stringa[i];
                    }
                    for (i=spazio+1; i!='\0'; i++) {
                        numero[i]=stringa[i];
                    }
                    atoi(numero);
                    nodorandom=malloc(sizeof(Lista));
                    strcpy(nodorandom->city, citta);
                    nodorandom->pos=numero;
                    nodorandom->next=listarandom;
                    listarandom=nodorandom;                   
                    
            }
            while (!feof(fp));
        
    }
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 15:22   #16
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Grosso modo si...
Premesso che c'è un errore nel ciclo che compone la stringa "numero", ovvero che testi che "i" sia diverso da zero binario, quando dovrebbe essere il carattere della stringa ad essere testato, cioè numero[i]: c'è un modo molto più semplice per copiare una sottostringa, eccolo:
Codice:
strncpy(citta, stringa, spazio);
strcpy(numero, &(stringa[spazio+1]));
Poi nella lista stai inserendo la variabile "numero", che ti ricordo che è una stringa, mentre dovresti mettervi il risultato di atoi, che attualmente non assegni a nessuna variabile.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 15:33   #17
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
ah ok quindi devo assegnare una variabile ad atoi e inserire quella nella lista giusto? Per quanto riguarda la i, non sapevo se mettere i!='\0' o diverso da M che sarebbe una macro che ho definito e che rappresenta la grandezza delle stringhe, perchè teoricamente, nella variabile "stringa" dovrei avere ad esempio
"roma 10\0" e se metto che i<M potrebbe darmi un errore in quanto conta anche il '\0'?
Comunque ora prendo le due funzioni che mi hai passato, delle stringhe ci hanno insegnato solo strcpy e strcmp quindi non sapevo di queste altre molto utili, grazie

PS: nel buildare il programma, la console mi da un errore "undefined reference to strrpos" anche se ho incluso string.h

Ultima modifica di ShadiBlizzard : 27-02-2014 alle 15:37.
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 16:00   #18
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Tecnicamente devi assegnare il valore di ritorno di atoi ad una variabile, non il contrario. Puoi anche assegnarlo direttamente al campo nella tua lista, senza usare variabili d'appoggio.

Per quanto riguarda la lunghezza delle stringhe, dal momento che è variabile, devi testare sempre il terminatore, non la lunghezza; comunque se usi strncpy e strcpy come ti ho mostrato non avrai bisogno del ciclo.

Per quanto riguarda strrpos è un mio refuso, al suo posto puoi usare strrchr, ma fai attenzione che restituisce un puntatore, non un indice.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 16:06   #19
ShadiBlizzard
Junior Member
 
Iscritto dal: Feb 2014
Messaggi: 20
strrchr restituisce un puntatore alla posizione in cui si trova l'occorrenza? Quindi nella strncpy devo scrivere
Codice:
strncpy(citta, stringa, &spazio)
strcpy(citta, &(spazio+1))
ovviamente spazio ora è di tipo char *;


per l'atoi ho corretto così:

Codice:
nodorandom->pos=atoi(numero);
Mi è tutto chiaro comunque ora, grazie mille


EDIT: ho usato un ciclo per trovare la posizione di &spazio e quindi ora ho l'int

Ultima modifica di ShadiBlizzard : 27-02-2014 alle 16:23.
ShadiBlizzard è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2014, 18:20   #20
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Bene, se hai l'indice puoi utilizzare strncpy e strcpy come ti avevo indicato prima. Prova a fare una stampa della lista per vedere se la lettura avviene correttamente, poi passa all'ordinamento.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
La NASA ha lanciato il nuovo Nancy Grace...
22 offerte Amazon da non perdere, dalla ...
Bose QuietComfort Earbuds a 129,95€: ANC...
L'unico con tante scorte, non fatevi sca...
Torna il super doppio sconto sulle e-bik...
Offerte Amazon componenti PC: RTX 5060 T...
Crucial Pro DDR5 da 32GB a 389,99€: perc...
Fable 5, il modello più potente d...
PC all-in-one Lenovo super elegante, per...
Lo Smart TV più venduto su Amazon...
Periferiche gaming in offerta su Amazon:...
L'IA non è una bolla, ma pu&ograv...
Il cinema in salotto: oggi TV Xiaomi QLE...
Passa a ho. Mobile, fino a fine agosto c...
Ai Giochi di Pechino i robot prendono fu...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v