seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
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 è:
Codice sorgente - presumibilmente C/C++ |
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
|
|
seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
Potresti farmi un esempio con il codice perfavore?
ricorda che devo prelevare le due liste da file
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
La struttura è così:
Codice sorgente - presumibilmente C++ |
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
|
|
seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
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,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
|
|
seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
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? |
|
seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
Codice sorgente - presumibilmente C++ |
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...
|
|
seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
Ora ho provato questo, che non mi da errori ma poi il programma si blocca e windows mi chiede "termina adesso"
Codice sorgente - presumibilmente C/C++ |
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.
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
ovvio che si blocca.
prova[ i ] è una stringa non inizializzata, un semplice puntatore. Devi allocare la stringa prima di passarla alla fgets
Lo fai esplicitamente:
Codice sorgente - presumibilmente C/C++ |
oppure usando la new
Ultima modifica effettuata da lorenzo il 18/12/2010 alle 18:16 |
|
seigi (Normal User)
Newbie
Messaggi: 8
Iscritto: 17/12/2010
|
Ma ho lo stesso risultato anche facendo così:
Codice sorgente - presumibilmente C++ |
#include <cstdlib> #include <iostream> #define MAX_LINES 100205 #define MAX_LENGTH 100 using namespace std; int main(int argc, char *argv[]) { char prova [MAX_LINES][MAX_LENGTH]; FILE*fid; fid=fopen("comuni.txt","r"); if(!fid) { cout << "file non aperto!"; } else { for (int i=0; i<MAX_LINES; i++) { fgets(prova[i],100,fid); } } cout << prova;
|
|
|