PDA

Visualizza la versione completa : stringhe in c che incubooooooo!!!


matis25
25-12-2002, 17:54
Ciao a tutti vorrei che mi aiutaste nel risolvere questo piccolo problema con il linguaggio C.
allora io ho un file di testo che si chiama agenda.txt nel queale ci sono queste tre stringhe:
pippo pluto 0293255165
andrea porri 111111
luis filippo 0147896

io vorrei visualizzare il contenuto di questo file (agenda.txt) e nello stesso tempo riordinare (per nome) in ordine alfabetico le tre stringhe,
in modo tale che io abbia sullo schermo questo:
andrea porri 111111
luis filippo 0147896
pippo pluto 0293255165
controllatemi il mio codice sorgente e ditemi dove sbaglio grazie. ho utilizzato uno switch come menu il mio problema si trova nel case 2.

codice sorgente:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


int scelta;
int menu (void);
void registra_utente(char *a, char *b , char *c);
int comp(const void *s1 , const void *s2);

int main()
{
FILE *fp;
char nomeutente[81], cognomeutente[81], telefono[15];
char rubrica[20];


int scelta = menu();

switch (scelta)
{
case 1:
{
fflush(stdin);
printf("\nInserisci il nomeutente , il cognomeutente e il numero di telefono");
printf("\nseparati da uno spazio vuoto\n");
scanf("%s%s%s" , nomeutente,cognomeutente,telefono);
fflush(stdin);
registra_utente(nomeutente , cognomeutente , telefono);
break;
}
case 2:
{

if ( (fp = fopen("agenda.txt" , "r" )) == NULL)
{
printf("\nErrore apertura file");
exit(1);
}

while ( !feof(fp) )
{
fgets(rubrica, sizeof(rubrica), fp);
qsort(rubrica , 20 , sizeof(rubrica[0]), comp);
printf("%s" , rubrica);
}
fclose(fp);
break;
}
case 3:
{
printf("hai scelto 3");
break;
}
case 4:
{
printf(" hai scelto 4");
break;
}
default:
{
puts("fuori intervallo massimo riprova");
}
}

system("PAUSE");
return 0;
}
/* intestazione e definizione della funzione menu*/
int menu (void)
{
int numero;
printf("PROGRAMMA AGENDA .\n");
printf("\n");
puts("Scegli una funzione");
printf("\n");
printf("1 - Inserire Contatto\n");
printf("2 - Leggere Rubrica\n");
printf("3 - Ricerca contatto\n");
printf("4 - Uscire dal programma\n");
scanf("%d" , &numero);
return numero;
}

/*funzioneper inserire nome,cognome e num_tel dell'utente*/
void registra_utente(char *a, char *b , char *c)
{
FILE *fp;
if ( (fp = fopen("agenda.txt" , "a+" )) == NULL)

{
printf("\nErrore apertura file");
exit(1);
}
fprintf(fp, "%s %s %s\n" ,a,b,c);
fclose(fp);
}

/* funzione comp per il confronto in qsort*/
int comp(const void *s1, const void *s2)
{
return (strcmp(*(char **)s1, *(char **)s2));
}

Johnny_Depp
26-12-2002, 06:12
devi ordinare le stringhe "nome cognome telefono"
prima di registrarle nel file...

1)inserisci le 3 stringhe nome, cognome, telefono
2)le concateni in un'unica stringa "rubrica" (p.s. potresti anche utilizzare direttamente una sola stringa chiamata rubrica.)
3)ora apri il file agenda.txt
4)con fgets() leggi le singole righe (stringhe composte da nome, cogn., tel.) e le inserisci in un array
5)ora inserisci rubrica "al punto giusto" (aaa, bbb, ccc)
6)poi apri il file agenda in input --> quindi cancellando tutto
il suo contenuto, e inserisci l'intero array ORDINATO.

p.s. se fai così, in fase di lettura dell'agenda troverai sempre
il contenuto del file ordinato.

matis25
26-12-2002, 16:54
ok ci provo... poi ti farò sapere
grazie...

matis25
27-12-2002, 17:16
senti non riesco a fare come dici tu, puoi farmi un esempio semplice affinchè io possa capire?
grazie e ciao

AR64S-H
02-01-2003, 18:10
Mi spieghi perchè hai usato questo comando
qsort(rubrica , 20 , sizeof(rubrica[0]), comp);

io se lo lascio non riesco a visualizzare i nomi in modo ordinato l'ho canellato e riesco a visualizzarli bene.
Grazi
Ciao

matis25
07-01-2003, 19:33
senti ma come fai a visualizzare quei dati inseriti in ordine alfabetico senza una funzione che ordina i dati...cosi tu li leggi certo ma non in ordine alfabetico!!

r0x
07-01-2003, 19:47
Secondo me potresti usare questo metodo. Prima di tutto crei una struttura del tipo:



struct info
{
/* evito allocazioni per semplicita` */
/* le dimensioni sono indicative */

char nome[ 24 ];
char cognome[ 32 ];

char telefono[ 16 ];

struct info *next;
};


Questa sara` il nodo di una lista ordinata.

Man mano che leggi le righe dal file, le inserisci in nodi di questo tipo. Nell`operazione di inserimento nella lista, verifichi l`ordine alfabetico nome-cognome.

Completata la lettura da file, e quindi la lista, ci fai quello che ti pare, e sara` anche ordinata. :)

Per chiarimenti posta qui.. pero` provaci anche da solo almeno! :tongue:

Ciao.

AR64S-H
11-01-2003, 18:44
Per matis25:

Il risultato a video con il comando qsort è tipo:

io3535 ssio245srfkc
loa34552p fer3345rrar3
Per questo l'ho cancellato

matis25
16-01-2003, 12:53
ciao scusa se ti disturbo..
se io nel mio file agenda.txt ho queste tre stringhe(pero' potrei averne molte di più)
giuseppe garibaldi 123456
giulio gesare 258963
andrea rossi 1478963
come faccio a leggere il file (ok con fopen) e ad inserire i nomi nell'elemento della struttura char nome , i cognomi nell'elemento della struttura cognome e il numero di telefono nell'elemento della struttura telefono... questo è il mio primo problema potresti aiutarmi?
code:
struct info
{
/* evito allocazioni per semplicita` */
/* le dimensioni sono indicative */

char nome[ 24 ];
char cognome[ 32 ];

char telefono[ 16 ];

struct info *next;
};



Questa sara` il nodo di una lista ordinata.

Man mano che leggi le righe dal file, le inserisci in nodi di questo tipo. Nell`operazione di inserimento nella lista, verifichi l`ordine alfabetico nome-cognome.

Completata la lettura da file, e quindi la lista, ci fai quello che ti pare, e sara` anche ordinata.

Per chiarimenti posta qui.. pero` provaci anche da solo almeno!

r0x
16-01-2003, 21:01
Si tratta di fare uno strncpy() (strcpy() per n caratteri), non ci vuole la scienza. E non mi chiedere come si usa, non a me..

Ciao.

Loading