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 a prelevare stringhe da un file..
Forum - C/C++ - Problema a prelevare stringhe da un file..

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


Messaggi: 8
Iscritto: 17/12/2010

Segnala al moderatore
Postato alle 0:47
Venerdì, 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++

  1. int i=0;
  2.   char com[10205][50];
  3.    
  4.     FILE * fid;
  5.     fid=fopen("comuni.txt","r");
  6.    
  7.    while (!fid) {
  8.          com[i][0]=fscanf(fid,"/n");
  9.          i++; }



Ma non sembra funzionare, accetto sia correzioni su questo codice che consigli su metodi o funzioni diverse... e grazie a tutti in anticipo :)

PM
Avatar
seigi (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 10:59
Venerdì, 17/12/2010
Potresti farmi un esempio con il codice perfavore? 8-|
ricorda che devo prelevare le due liste da file :)


PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 11:53
Venerdì, 17/12/2010
La struttura è così:

Codice sorgente - presumibilmente C++

  1. typedef struct _Dict
  2. {
  3.     char *key;
  4.     char *obj;
  5. }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

PM
Avatar
seigi (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:40
Venerdì, 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

PM
Avatar
seigi (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 19:27
Venerdì, 17/12/2010
Testo quotato

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?

PM
Avatar
seigi (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 21:45
Venerdì, 17/12/2010
Codice sorgente - presumibilmente C++

  1. struct codici {
  2.          char nome;
  3.          char animali;
  4.          } codici;
  5.  
  6.  
  7.  
  8.     FILE*fid;
  9.     fid=fopen("comuni.txt","r");
  10.  
  11.    if(!fid) {
  12.             cout << "file non aperto!"; }
  13.    else {
  14.         for (int i=0; i<1000; i++) {
  15.               fscanf(fid,"char",codici.animali[i]);
  16.               }
  17.               }



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...

PM
Avatar
seigi (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 16:56
Sabato, 18/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++

  1. char *prova[100205];
  2.  
  3.  
  4.  
  5.     FILE*fid;
  6.     fid=fopen("comuni.txt","r");
  7.  
  8.    if(!fid) {
  9.             cout << "file non aperto!"; }
  10.    else {
  11.         for (int i=0; i<100205; i++) {
  12.               fgets(prova[i],100,fid);
  13.               }
  14.               }
  15.        
  16.         cout << prova;



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

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 18:14
Sabato, 18/12/2010
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++

  1. char prova[x][y]



oppure usando la new

Ultima modifica effettuata da lorenzo il 18/12/2010 alle 18:16
PM
Avatar
seigi (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 2:32
Domenica, 19/12/2010
Ma ho lo stesso risultato anche facendo così:
Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #define MAX_LINES     100205
  4. #define MAX_LENGTH       100
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.  
  10.  
  11. char prova [MAX_LINES][MAX_LENGTH];
  12.  
  13. FILE*fid;
  14.     fid=fopen("comuni.txt","r");
  15.  
  16.    if(!fid) {
  17.             cout << "file non aperto!"; }
  18.    else {
  19.         for (int i=0; i<MAX_LINES; i++) {
  20.               fgets(prova[i],100,fid);
  21.               }
  22.               }
  23.        
  24.         cout << prova;


:(

PM
Pagine: [ 1 2 ] Precedente | Prossimo