Oppure

Loading
16/12/10 23:47
seigi
Premetto che è per l'università, e nel mio corso stiamo usando in pratica il C, con solo alcune implementazioni del C++.
Non posso quindi usare String e Vector ad esempio.

Allora, quello che cerco di fare è, dati due elenchi, abbinare a quello che sceglie l'utente dal primo una parola presente nel secondo.
Mi spiego meglio, ammettiamo di avere l'elenco dei nomi di persona e un elenco di nomi di animali. A ogni nome corrisponde uno e un solo nome di animale, così che l'utente scrivendo "Angelo" verrà stamparsi "Elefante".

La prima cosa che cercavo di fare, per arrivare a ciò, era dunque (visto la lunghezza dell'elenco) creare un array di stringhe prelevandole da un file txt.

Quello che ho provato è:
int i=0;
  char com[10205][50];
    
    FILE * fid;
    fid=fopen("comuni.txt","r");
   
   while (!fid) {
         com[i][0]=fscanf(fid,"/n");
         i++; } 


Ma non sembra funzionare, accetto sia correzioni su questo codice che consigli su metodi o funzioni diverse... e grazie a tutti in anticipo :)
aaa
17/12/10 0:40
HeDo

quello che vuoi implementare si chiama dizionario. devi dichiarare un array di struct con all'interno due campi stringa, quando l'utente inserisce la stringa da cercare basta scorrere l'array confrontando chiave per chiave la prima stringa, quando la trovi stampi la seconda :)
aaa
17/12/10 9:59
seigi
Potresti farmi un esempio con il codice perfavore? 8-|
ricorda che devo prelevare le due liste da file :)

aaa
17/12/10 10:53
lorenzo
La struttura è così:


typedef struct _Dict
{
    char *key;
    char *obj;
}Dict;



Poi ci sono i due casi:

1) Se hai due file di testo in ordine (1 record persone <=> 1 record animali stando all'esempio)
allora basta caricare i due file con la fopen e leggere in contemporanea la riga N-esima. Metterai il risultato del file persone in key, il risultato del file animali in obj

2) Se i due file non sono ordinati allora la cosa si complica, dato che dovrai caricarti in memoria tutti i due file ed effettuare ricerche(secondo un criterio che ti avranno dato) e riempire allo stesso modo del punto 1) l'array di Dict
aaa
17/12/10 11:40
seigi
I file contengono un nome per ogni riga e sono in ordine alfabetico,quindi presumo ordinati.
Ma se io li carico in key e obj a rigor di logica dovrebbe creare un array con tutte le parole messe in fila, e non una array di stringhe dove a ogni key[i],ad esempio, corrisponde un nome intero...
a meno che per caricare i file non si usi qualche funzione che ancora non conosco, e in questo caso sarei felice di conoscerla :P
aaa
17/12/10 18:27
seigi
Postato originariamente da lorenzo:

allora basta caricare i due file con la fopen e leggere in contemporanea la riga N-esima. Metterai il risultato del file persone in key, il risultato del file animali in obj



è esattamente quello che da due giorni non riesco a fare, potreste passarmi un esempio in codice?
aaa
17/12/10 20:45
seigi
  struct codici {
         char nome;
         char animali;
         } codici;
  


    FILE*fid;
    fid=fopen("comuni.txt","r");

   if(!fid) { 
            cout << "file non aperto!"; }
   else { 
        for (int i=0; i<1000; i++) {
              fscanf(fid,"char",codici.animali[i]);
              }
              }


sò che non è proprio così che và implementato, ma all'interno dell'fscanf mi dà "invalid types" e non capisco perchè.
Scusate il multi-post ma ci sono da parecchi giorni...
aaa
18/12/10 15:56
seigi
Ora ho provato questo, che non mi da errori ma poi il programma si blocca e windows mi chiede "termina adesso"
char *prova[100205];
 


    FILE*fid;
    fid=fopen("comuni.txt","r");

   if(!fid) {
            cout << "file non aperto!"; }
   else {
        for (int i=0; i<100205; i++) {
              fgets(prova[i],100,fid);
              }
              }
       
        cout << prova;


purtroppo i file da caricare sono molti e non sò come fare.
aaa