Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema rubrica
Forum - C/C++ - problema rubrica

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Ripper_92 (Normal User)
Newbie


Messaggi: 15
Iscritto: 02/07/2009

Segnala al moderatore
Postato alle 22:25
Martedì, 14/07/2009
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
Codice sorgente - presumibilmente C++

  1. int i=0;
  2.      char *letturatab[1000];
  3.      FILE* lista=fopen("NameList.rip","r");
  4.      FILE* listatmp=fopen("NameList.tmp","w");
  5.      if (lista)
  6.      {
  7.         while (strcmp(letturatab[i],nomerip)<0)
  8.         {
  9.            fgets(letturatab[i],30,lista);
  10.            fprintf(listatmp,"%s",letturatab[i]);
  11.            printf("%s hgf",letturatab[i]);
  12.            i++;
  13.         }
  14.         strcpy(letturatab[i],nomerip);
  15.         fprintf(listatmp,"%s",nomerip);
  16.         i++;
  17.         while  (!feof(lista) && !lista)
  18.         {
  19.            fgets(letturatab[i],30,lista);
  20.            fprintf(listatmp,"%s",letturatab[i]);
  21.            i++;
  22.         }
  23.      }
  24.      else
  25.      {
  26.         fprintf(listatmp,"%s\n",nomerip);    
  27.         strcpy(letturatab[i],nomerip,30);
  28.         i++;
  29.      }
  30.      fclose(lista);
  31.      fclose(listatmp);
  32.      lista=fopen("NameList.rip","w");
  33.      listatmp=fopen("NameList.tmp","r");
  34.      char lettlist[30];
  35.      while (!feof(listatmp))
  36.      {
  37.            fgets(lettlist,30,listatmp);
  38.            fprintf(lista,"%s",lettlist);
  39.            i++;
  40.      }
  41.      fclose(lista);
  42.      fclose(listatmp);
  43.      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:

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 0:33
Mercoledì, 15/07/2009
Testo quotato

"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?

PM Quote
Avatar
Ripper_92 (Normal User)
Newbie


Messaggi: 15
Iscritto: 02/07/2009

Segnala al moderatore
Postato alle 9:08
Mercoledì, 15/07/2009
io inserisco da tastiera il nome del contatto.
ho cambiato nel frattempo codice che però ahimè non va lo stesso.
Codice sorgente - presumibilmente C++

  1. int i=0;
  2.      char *letturatab[1000];
  3.      FILE* lista=fopen("NameList.rip","r");
  4.      if (lista)
  5.      {
  6.         while (!feof(lista))
  7.         {
  8.               fgets(letturatab[i],30,lista);
  9.               i++;
  10.         }
  11.         strcpy(letturatab[i],nome);
  12.         InsertionSort(letturatab);
  13.      }
  14.      else
  15.         strcpy(letturatab[i],nome);
  16.      fclose(lista);
  17.      lista=fopen("NameList.rip","w");
  18.      char lettlist[30];
  19.      i=0;
  20.      while (letturatab[i])
  21.      {
  22.            fprintf(lista,"%s\n",letturatab[i]);
  23.            i++;
  24.      }
  25.      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
Codice sorgente - presumibilmente C/C++

  1. else
  2.         strcpy(letturatab[i],nome);


Ultima modifica effettuata da Ripper_92 il 15/07/2009 alle 9:11
PM Quote
Avatar
Ripper_92 (Normal User)
Newbie


Messaggi: 15
Iscritto: 02/07/2009

Segnala al moderatore
Postato alle 11:40
Mercoledì, 15/07/2009
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 \0?

Ultima modifica effettuata da Ripper_92 il 15/07/2009 alle 11:40
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:02
Mercoledì, 15/07/2009
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 ('\0') 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 '\0'. 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 '\0' :k:

PM Quote
Avatar
Ripper_92 (Normal User)
Newbie


Messaggi: 15
Iscritto: 02/07/2009

Segnala al moderatore
Postato alle 13:47
Mercoledì, 15/07/2009
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)

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 14:30
Mercoledì, 15/07/2009
Testo quotato

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 :)

Testo quotato


per quanto riguarda l'ultimo problema il tappo ('\0') 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 '\0'. 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 '\0' :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 ^^'


Testo quotato

mi mette anche dei caratteri che non c'entrano niente


Cioè? quali sarebbero questi caratteri!?

Ultima modifica effettuata da Lawliet il 15/07/2009 alle 14:43
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:17
Mercoledì, 15/07/2009
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 '\0' alla fine della prima stringa:k:

Ultima modifica effettuata da il 15/07/2009 alle 15:18
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 15:34
Mercoledì, 15/07/2009
Testo quotato

Postato originariamente da ingMark:
se non allochi almeno il numero delle righe come fai ogni volta ad inserirlo in rubrica[indice]?


Se si tratta di inserire nel vettore di stringhe, semplice fai:
rubrica[indice] = "....";
niente di complicato :D

Testo quotato


le stringhe sono dei vettori per il c.
un vettore di vettori è una matrice.


Teoricamente si, se noti bene, puoi anche fare così rubrica[][]; (se non ricordo male, una volta provai e vidi che funzionava ^^')

Testo quotato

non capisco questa scrittura *rubrica[1000] :)


Anche io utilizzo questo metodo, è che se non specifica quante persone vuole inserire penso che bisogna fare così, ovviamente è limitato non è che può inserire 1500 persone! :D, va in crash (quindi è sempre consigliato mettere la dimensione). Però se devi poi allocare dinamicamente allora il discorso cambia, qui devi comunque mettere un numero di byte da allocare in memoria.

No so spiegarmi bene, se te lo spiega qualcuno più esperto di me è meglio xD.
Ma penso che sia la stessa cosa come dichiarare char *stringa; che è un vettore di stringhe oppure int vettore[]; come variabile globale, assume lo stesso comportamento :)

Ultima modifica effettuata da Lawliet il 15/07/2009 alle 15:37
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo