|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
mi escono termini strani è.è tutto sommato la lista me la compone, adesso lo riguardo per vedere se c'è qualche errore
|
![]() |
![]() |
![]() |
#22 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
Questa è la parte del codice in questione.
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=strrchr(stringa, ' '); int i, pos_spazio; for (i=0; i<M; i++) { if (stringa[i]==&spazio) pos_spazio=i; } strncpy(citta, stringa, pos_spazio); strcpy(numero, &(stringa[pos_spazio+1])); nodorandom=malloc(sizeof(Lista)); strcpy(nodorandom->city, citta); nodorandom->pos=atoi(numero); nodorandom->next=listarandom; listarandom=nodorandom; } while (!feof(fp)); } fclose(fp); |
![]() |
![]() |
![]() |
#23 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non ci siamo... il ciclo che dovrebbe dividere la stringa è completamente sballato, cerca di capire prima cosa devi fare e poi traducilo in istruzioni.
Poi non hai ancora applicato l'algoritmo che ti ho proposto per la lettura da file, se il file è vuoto il tuo programma darà i numeri. |
![]() |
![]() |
![]() |
#24 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
Codice:
fp=fopen("C:\\Users\\Giulia\\Desktop\\itinerario.txt", "r"); if (fp==NULL) { printf("impossibile aprire il file\n"); return -1; } fgets(stringa, M, fp); while(!feof(fp)) { spazio=strrchr(stringa, ' '); int i, pos_spazio; for (i=0; i<M; i++) { if (stringa[i]==&spazio) pos_spazio=i; } strncpy(citta, stringa, pos_spazio); strcpy(numero, &(stringa[pos_spazio+1])); nodorandom=malloc(sizeof(Lista)); strcpy(nodorandom->city, citta); nodorandom->pos=atoi(numero); nodorandom->next=listarandom; listarandom=nodorandom; fgets(stringa, M, fp); } fclose(fp); |
![]() |
![]() |
![]() |
#25 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Facciamo progressi, hai applicato correttamente l'algoritmo di lettura
![]() Ora passiamo alla separazione dei campi, potresti usare il seguente algoritmo: Codice:
for (i = 0; stringa[i] != 0; i++) { if (stringa[i] == ' ') { pos_spazio = i; } } |
![]() |
![]() |
![]() |
#26 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
Codice:
fgets(stringa, M, fp); while (!feof(fp)) { //spazio=strrchr(stringa, ' '); int i; for (i=0; stringa[i]!=0; i++) { if(stringa[i]==' ') { pos_spazio=i; } } strncpy(citta, stringa, pos_spazio); strcpy(numero, &stringa[pos_spazio+i]); nodorandom=malloc(sizeof(Lista)); strcpy(nodorandom->city, citta); nodorandom->pos=atoi(numero); nodorandom->next=listarandom; listarandom=nodorandom; fgets(stringa, M, fp); } |
![]() |
![]() |
![]() |
#27 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non è
strcpy(numero, &stringa[pos_spazio+i]);ma strcpy(numero, &stringa[pos_spazio+1]);che significa che bisogna cominciare a copiare dalla posizione successiva allo spazio. Se sommi i (che a fine ciclo è pari alla lunghezza della stringa), cominci a copiare ben oltre la fine della stringa. |
![]() |
![]() |
![]() |
#28 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
sisi ho scritto 1, ho copiato sbagliato
|
![]() |
![]() |
![]() |
#29 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
Allora, questo è il programma che viene eseguito
![]() |
![]() |
![]() |
![]() |
#30 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Ehm, mi sono dimenticato che strncpy non copia il terminatore
![]() Aggiungi subito dopo: citta[pos_spazio] = 0; |
![]() |
![]() |
![]() |
#31 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
Perfetto, adesso funziona benissimo :3 anche l'ordinamento
![]() questa tattica la posso usare anche nel caso mi trovi davanti 3 o 4 stringhe? (per i deliri di onnipotenza della prof ci sono esercizi in cui ad esempio hai un file con scritto cinque due tre fine quattro sette fine in cui devi leggere riga per riga e convertire la parola in numero salvando in un array, io avevo pensato alla strstr in questo caso) |
![]() |
![]() |
![]() |
#32 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non ho capito se le parole stanno una su ogni riga o tutte sulla stessa riga (magari con più righe), in ogni caso se le parole non contengono spazi conviene di più leggerle una alla volta con fscanf.
|
![]() |
![]() |
![]() |
#33 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
nono stanno tutte sulla stessa riga, o meglio, ogni numero su una riga, in pratica ad esempio 125 scritto in lettera, 76, 1023.. potrei usare l'fscanf se sapessi a priori quante stringhe sono ma di fatto non lo so potrei avere anche ad esempio un 4
uno due cinque fine sette sei fine uno zero due tre fine quattro fine |
![]() |
![]() |
![]() |
#34 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Va benissimo fscanf, il ciclo termina sempre alla fine del file grazie alla funzione feof.
|
![]() |
![]() |
![]() |
#35 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 20
|
ok:3 grazie mille dell'aiuto e della pazienza ahah ora è tutto chiaro xD
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:50.