Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
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


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
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