Oppure

Loading
14/07/09 20:25
Ripper_92
sto cercando di fare una rubrica in C e devo farla in modo che i contatti immessi si visualizzino nel prompt e anche in una tabella html. ho pensato di gestirla con 2 file per contatto, uno per la visualizzazione nel prompt e uno per la riga dell'html. siccome la tabella deve essere ordinata, avevo pensato di usare un file come array. il problema è che quando vado a gestire la lista in compilazione non segna nessun errore ma quando vado ad inserire un nuovo contatto penso vada in overflow. volevo sapere se qualcuno mi può dare una mano, vi posto il pezzo di codice che non funziona. anche se penso che sia la funzione strcpy che rompe
     int i=0;
     char *letturatab[1000];
     FILE* lista=fopen("NameList.rip","r");
     FILE* listatmp=fopen("NameList.tmp","w");
     if (lista)
     {
        while (strcmp(letturatab[i],nomerip)<0)
        {
           fgets(letturatab[i],30,lista);
           fprintf(listatmp,"%s",letturatab[i]);
           printf("%s hgf",letturatab[i]);
           i++;
        }
        strcpy(letturatab[i],nomerip);
        fprintf(listatmp,"%s",nomerip);
        i++;
        while  (!feof(lista) && !lista)
        {
           fgets(letturatab[i],30,lista);
           fprintf(listatmp,"%s",letturatab[i]);
           i++;
        }
     }
     else
     {
        fprintf(listatmp,"%s\n",nomerip);    
        strcpy(letturatab[i],nomerip,30);
        i++;
     }
     fclose(lista);
     fclose(listatmp);
     lista=fopen("NameList.rip","w");
     listatmp=fopen("NameList.tmp","r");
     char lettlist[30];
     while (!feof(listatmp))
     {
           fgets(lettlist,30,listatmp);
           fprintf(lista,"%s",lettlist);
           i++;
     }
     fclose(lista);
     fclose(listatmp);
     system("del NameList.tmp");


ps: namelist.rip è il file che contiene la lista dei nomi
namelist.tmp è un file di appoggio per ordinare la lista
i nomi li metto in un array di puntatori per agevolarela costruzione della tabella, al posto di riaprire il file della lista

grazie a tutti!:rofl:
aaa
14/07/09 22:33
Lawliet
"inserire un nuovo contatto penso vada in overflow

ma a cosa ti riferisci? Al fatto che inserisci da tastiera e la metti in lista?

E che tipo di ordinamento hai usato, per ordinare la lista?
aaa
15/07/09 7:08
Ripper_92
io inserisco da tastiera il nome del contatto.
ho cambiato nel frattempo codice che però ahimè non va lo stesso.
     int i=0;
     char *letturatab[1000];
     FILE* lista=fopen("NameList.rip","r");
     if (lista)
     {
        while (!feof(lista))
        {
              fgets(letturatab[i],30,lista);
              i++;
        }
        strcpy(letturatab[i],nome);
        InsertionSort(letturatab);
     }
     else
        strcpy(letturatab[i],nome); 
     fclose(lista);
     lista=fopen("NameList.rip","w");
     char lettlist[30];
     i=0;
     while (letturatab[i])
     {
           fprintf(lista,"%s\n",letturatab[i]);
           i++;
     }
     fclose(lista);

in questo ho cercato di performarlo rispetto all'altro, faceva proprio schifo... :pat:
adesso lo spiego: se esiste il file della lista dei nomi prende tutte le righe e le mette in 1 array. a quel punto copia il nome nuovo in coda e va a fare 1 ordinamento per inserimento(anche se non si vede, l'ho testato da un'altra parte e funziona) sennò va a mettere in ogni caso il nome all'interno dell'array. poi va a copiare l'array riga per riga nel file, così c'è la lista ordinata. adesso provo a fare qualche stampa a schermo per vedere dove si inceppa. spero di essere stato esauriente adesso

edito: se il file non esiste si inceppa in strcpy
     else
        strcpy(letturatab[i],nome);
Ultima modifica effettuata da Ripper_92 15/07/09 7:11
aaa
15/07/09 9:40
Ripper_92
ho risolto quel problema ma me ne è sorto un'altro, come faccio da una stringa letta da file a togliere il carattere di escape \n o ho risolto quel problema ma me ne è sorto un'altro, come faccio da una stringa letta da file a togliere il carattere di escape \n o {parsed_message}??
Ultima modifica effettuata da Ripper_92 15/07/09 9:40
aaa
15/07/09 10:02
come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]

per quanto riguarda l'ultimo problema il tappo ('come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]

per quanto riguarda l'ultimo problema il tappo ('{parsed_message}') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '{parsed_message}'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '{parsed_message}' :k:') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con 'come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]

per quanto riguarda l'ultimo problema il tappo ('{parsed_message}') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '{parsed_message}'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '{parsed_message}' :k:'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il 'come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]

per quanto riguarda l'ultimo problema il tappo ('{parsed_message}') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '{parsed_message}'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '{parsed_message}' :k:' :k:
15/07/09 11:47
Ripper_92
l'ho risolto senza usare le matrici il primo problema... :yup: per il secondo mi è venuta proprio l'idea di contare la lunghezza solo che non capisco perché mi mette anche dei caratteri che non c'entrano niente (devo concatenare alla stringa che prende con fgets una fissa che non cambia e proprio fra queste due ci sono caratteri che non c'entrano niente)
aaa
15/07/09 12:30
Lawliet
Postato originariamente da ingMark:

come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]


Ti sbagli ingMark, char *rubrica[max_nome] è già un vettore di stringhe! Quindi non è necessario che debba fare come hai scritto tu :)

per quanto riguarda l'ultimo problema il tappo ('
Postato originariamente da ingMark:

come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]


Ti sbagli ingMark, char *rubrica[max_nome] è già un vettore di stringhe! Quindi non è necessario che debba fare come hai scritto tu :)

per quanto riguarda l'ultimo problema il tappo ('{parsed_message}') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '{parsed_message}'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '{parsed_message}' :k:

Permettimi di correggerti se non erro, "è colpa della gets" questa affermazione è sbagliata anche perchè, la lettura della gets si ferma fino alla newline e quindi scrive correttamente la stringa, mentre la fgets no, include anche \n.
Però come hanno detto molti, è sconsigliato l'uso della gets ma bensì consigliato usare la fgets, in quanto evita problemi con buffer overflow. Una soluzione al problema, può essere quella di ingMark, oppure usi momentaneamente gets o ancora leggi carattere per carattere da tastiera (stdin) e anche da file usando la funzione fgetc/getc. Hai tante scelte ^^'


mi mette anche dei caratteri che non c'entrano niente

Cioè? quali sarebbero questi caratteri!?') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '
Postato originariamente da ingMark:

come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]


Ti sbagli ingMark, char *rubrica[max_nome] è già un vettore di stringhe! Quindi non è necessario che debba fare come hai scritto tu :)

per quanto riguarda l'ultimo problema il tappo ('{parsed_message}') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '{parsed_message}'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '{parsed_message}' :k:

Permettimi di correggerti se non erro, "è colpa della gets" questa affermazione è sbagliata anche perchè, la lettura della gets si ferma fino alla newline e quindi scrive correttamente la stringa, mentre la fgets no, include anche \n.
Però come hanno detto molti, è sconsigliato l'uso della gets ma bensì consigliato usare la fgets, in quanto evita problemi con buffer overflow. Una soluzione al problema, può essere quella di ingMark, oppure usi momentaneamente gets o ancora leggi carattere per carattere da tastiera (stdin) e anche da file usando la funzione fgetc/getc. Hai tante scelte ^^'


mi mette anche dei caratteri che non c'entrano niente

Cioè? quali sarebbero questi caratteri!?'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '
Postato originariamente da ingMark:

come penso tu ti sia accorto (dall'ultimo messaggio che hai scritto) non ti basta un vettore ma ti serve una matrice per memorizzare più stringhe :P
quindi avrebbe dovuto essere

rubrica[MAX_PERSONE][MAX_NOME]


Ti sbagli ingMark, char *rubrica[max_nome] è già un vettore di stringhe! Quindi non è necessario che debba fare come hai scritto tu :)

per quanto riguarda l'ultimo problema il tappo ('{parsed_message}') non hai bisogno di toglierlo tu, non viene stampato, indica solo al c che quella su cui stai lavorando è una stringa.

per quanto riguarda il \n è colpa della gets o fgets in quanto prendono tutta la riga new line compreso.

una possibile soluzione è una volta letta la tua stringa con la (f)gets contare la lunghezza della stringa (strlen) e partendo dal fondo finchè non è un carattere sostituire quello che trovi con '{parsed_message}'. in questo modo non avrai più il new line ed eventuali spazi alla fine della stringa.

altrimenti puoi direttamente leggere carattere per carattere fino a che non trovi il '\n' e poi mettere nella posizione in cui sei arrivato il '{parsed_message}' :k:

Permettimi di correggerti se non erro, "è colpa della gets" questa affermazione è sbagliata anche perchè, la lettura della gets si ferma fino alla newline e quindi scrive correttamente la stringa, mentre la fgets no, include anche \n.
Però come hanno detto molti, è sconsigliato l'uso della gets ma bensì consigliato usare la fgets, in quanto evita problemi con buffer overflow. Una soluzione al problema, può essere quella di ingMark, oppure usi momentaneamente gets o ancora leggi carattere per carattere da tastiera (stdin) e anche da file usando la funzione fgetc/getc. Hai tante scelte ^^'


mi mette anche dei caratteri che non c'entrano niente

Cioè? quali sarebbero questi caratteri!?' :k:

Permettimi di correggerti se non erro, "è colpa della gets" questa affermazione è sbagliata anche perchè, la lettura della gets si ferma fino alla newline e quindi scrive correttamente la stringa, mentre la fgets no, include anche \n.
Però come hanno detto molti, è sconsigliato l'uso della gets ma bensì consigliato usare la fgets, in quanto evita problemi con buffer overflow. Una soluzione al problema, può essere quella di ingMark, oppure usi momentaneamente gets o ancora leggi carattere per carattere da tastiera (stdin) e anche da file usando la funzione fgetc/getc. Hai tante scelte ^^'


mi mette anche dei caratteri che non c'entrano niente

Cioè? quali sarebbero questi caratteri!?
Ultima modifica effettuata da Lawliet 15/07/09 12:43
aaa
15/07/09 13:17
si hai ragione la gets non include il newline, errore mio^^

per quanto riguarda la matrice è vero che (*rubrica)[1000] è un puntatore dimensionale, ma non capisco una cosa^^

se non allochi almeno il numero delle righe come fai ogni volta ad inserirlo in rubrica[indice]?
le stringhe sono dei vettori per il c.
un vettore di vettori è una matrice.
di conseguenza o la dichiaro come (*rubrica)[1000] (che mi pare non abbia comunque molto senso perchè sto specificando il numero di colonne) e poi faccio una malloc per allocare il numero di righe, oppure la dichiaro staticamente.

non capisco questa scrittura *rubrica[1000] :)
NB. non sto dicendo che ho ragione io, ma se mi sono perso qualche pezzo mi piacerebbe capirlo^^

per quanto riguarda i caratteri in mezzo alle due stringhe la causa potrebbe essere la mancanza di 'si hai ragione la gets non include il newline, errore mio^^

per quanto riguarda la matrice è vero che (*rubrica)[1000] è un puntatore dimensionale, ma non capisco una cosa^^

se non allochi almeno il numero delle righe come fai ogni volta ad inserirlo in rubrica[indice]?
le stringhe sono dei vettori per il c.
un vettore di vettori è una matrice.
di conseguenza o la dichiaro come (*rubrica)[1000] (che mi pare non abbia comunque molto senso perchè sto specificando il numero di colonne) e poi faccio una malloc per allocare il numero di righe, oppure la dichiaro staticamente.

non capisco questa scrittura *rubrica[1000] :)
NB. non sto dicendo che ho ragione io, ma se mi sono perso qualche pezzo mi piacerebbe capirlo^^

per quanto riguarda i caratteri in mezzo alle due stringhe la causa potrebbe essere la mancanza di '{parsed_message}' alla fine della prima stringa:k:' alla fine della prima stringa:k:
Ultima modifica effettuata da 15/07/09 13:18