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++ - Ricerca in un file di testo
Forum - C/C++ - Ricerca in un file di testo - Pagina 2

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


Messaggi: 6
Iscritto: 02/01/2010

Segnala al moderatore
Postato alle 10:21
Domenica, 03/01/2010
L'ho provata ma sicuramente sbaglio a passargli il valore della stringa...guarda un pò:
Codice sorgente - presumibilmente C#

  1. void CercaProdotti()
  2. {      
  3.         system("cls");
  4.        
  5.         int i=0;
  6.         int Ricerca;
  7.        
  8.        
  9.         cout << "Ricerca Prodotti per: " << endl;
  10.         cout << endl;
  11.         cout << "1.Nome " << endl;
  12.         cout << "2.Codice " << endl;
  13.         cout << "3.Marca " << endl;
  14.         cout << "4.Prezzo " << endl;
  15.         cin >> Ricerca;
  16.  
  17.         switch(Ricerca)
  18.         {
  19.         case 1:
  20.                 {
  21.             system("cls");
  22.                         string nome;
  23.                         cout << "Inserisci il Nome del Prodotto " << endl;
  24.                         cin >> nome;
  25.             ricercaPerNome(nome);
  26.    
  27.  }break;
  28.  
  29. void ricercaPerNome(string nome)
  30. {
  31.     ifstream fin("Magazzino.txt"); //apri il file dei dati
  32.     Prodotti tmpProd;
  33.     char tmpStr[100];
  34.  
  35.     bool trovata = false;    //flag per indicare il successo della ricerca
  36.  
  37.     //inizia il ciclo di ricerca
  38.     while (!trovata && !fin.eof())
  39.     {
  40.         // leggi dal file le quattro righe
  41.         fin.getline(tmpProd.NomeProdotto, 100);
  42.         fin.getline(tmpProd.Codice, 100);
  43.         fin.getline(tmpProd.Marca, 100);
  44.         fin.getline(tmpStr, 100);
  45.         tmpProd.Prezzo = atoi(tmpStr);
  46.  
  47.         //cerca se nella riga targa é compresa la targa da cercare
  48.         if (strstr(tmpProd.NomeProdotto, nome.c_str()) != NULL)
  49.         {
  50.             cout << "trovata" << endl;
  51.  
  52.                        //se la targa é quella, stampa gli altri dati
  53.             cout << tmpProd.NomeProdotto << endl;
  54.             cout << tmpProd.Codice << endl;
  55.             cout << tmpProd.Marca << endl;
  56.             cout << tmpProd.Prezzo << endl;
  57.             trovata = true;   //per uscire da ciclo
  58.         }
  59.     }
  60.  
  61. }


PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:30
Domenica, 03/01/2010
secondo me il while bisogna scriverlo cosi:

Codice sorgente - presumibilmente C/C++

  1. while (!trovata && !fin.eof())
  2.     {
  3.         // leggi dal file le quattro righe
  4.         fin.getline(tmpProd.NomeProdotto, 100, '\0');
  5.         fin.getline(tmpProd.Codice, 100, '\0');
  6.         fin.getline(tmpProd.Marca, 100, '\0');
  7.         fin.getline(tmpStr, 100, '\0');
  8.         tmpProd.Prezzo = atoi(tmpStr);
  9.  
  10.         //cerca se nella riga targa é compresa la targa da cercare
  11.         if (strstr(tmpProd.NomeProdotto, nome.c_str()) != NULL)
  12.         {
  13.             cout << "trovata" << endl;
  14.  
  15.                        //se la targa é quella, stampa gli altri dati
  16.             cout << tmpProd.NomeProdotto << endl;
  17.             cout << tmpProd.Codice << endl;
  18.             cout << tmpProd.Marca << endl;
  19.             cout << tmpProd.Prezzo << endl;
  20.             trovata = true;   //per uscire da ciclo
  21.         }
  22.     }



perchè forse se non si aggiunge '\0' cerca sempre sulla stessa linea...:-|

PM Quote
Avatar
bobo22 (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/01/2010

Segnala al moderatore
Postato alle 11:56
Domenica, 03/01/2010
:k:..grazie così mi trova la parola..però se inserisco una parola che non c'è come faccio a mandare a video un messaggio con "parola non trovata"?..perchè se metto l'else all'interno del while mi fa un loop

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:36
Domenica, 03/01/2010
Prova a mettere una variabile bool che inizializzi a false prima del while...nell'if dentro al while metti questa variabile bool = true;
poi sotto al while metti un if:

if(variabile booleana == false)
cout << "Non trovato\n";

Codice sorgente - presumibilmente Delphi

  1. bool X = false;
  2.  
  3. while (!trovata && !fin.eof())
  4.     {
  5.         if(ifs){
  6.         X = true; // se sei alla fine del file poni X = true
  7.         break;
  8.         }//ed esci dal while
  9.         // leggi dal file le quattro righe
  10.         fin.getline(tmpProd.NomeProdotto, 100, '\0');
  11.         fin.getline(tmpProd.Codice, 100, '\0');
  12.         fin.getline(tmpProd.Marca, 100, '\0');
  13.         fin.getline(tmpStr, 100, '\0');
  14.         tmpProd.Prezzo = atoi(tmpStr);
  15.  
  16.         //cerca se nella riga targa é compresa la targa da cercare
  17.         if (strstr(tmpProd.NomeProdotto, nome.c_str()) != NULL)
  18.         {
  19.            
  20.             cout << "trovata" << endl;
  21.  
  22.                        //se la targa é quella, stampa gli altri dati
  23.             cout << tmpProd.NomeProdotto << endl;
  24.             cout << tmpProd.Codice << endl;
  25.             cout << tmpProd.Marca << endl;
  26.             cout << tmpProd.Prezzo << endl;
  27.             trovata = true;   //per uscire da ciclo
  28.         }
  29.     }
  30. if(X == true)
  31. cout << "Non trovato\n";


Ultima modifica effettuata da il 03/01/2010 alle 19:18
PM Quote
Avatar
Claudio538 (Normal User)
Newbie


Messaggi: 1
Iscritto: 04/05/2019

Segnala al moderatore
Postato alle 20:44
Sabato, 04/05/2019
Invece di un semplice file di testo puoi usare un file binario, con record (o frasi) di uguale lunghezza, con inseriti i vari dati. In base al codice (0,1...) con la funzione fseek puoi creare un file ad accesso diretto.
(In questo caso creo uno struct esempio)

struct prodotto
{
char nome[21];
int codice;
...
}

Chiedi di inserire codice del prodotto
A questo punto apri il file, fai fseek(f,codice*sizeof(prodotto),0)
A questo punto dichiari (es) prodotto p, poi usi
fread(&p,1,sizeof(prodotto),f)
f(puntatore a file, cioè FILE *f) lo inizializzi per aprire il file (f=fopen("es.dat","r+b))
e poi chiudi con fclose(f).
Le funzioni che servono sono in stdlib.h
Per visualizzare p ti basta fare cout di p.nome e avanti così per tutti i dati contenuti nello struct. Scusa se alcune o tutte queste cose le sapevi già, ma non ho tempo di guardare approfonditamente il codice

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2306
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 0:00
Domenica, 05/05/2019
Il topic è del 2010...


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 2:35
Domenica, 05/05/2019
Testo quotato

Postato originariamente da Claudio538:
Invece di un semplice file di testo puoi usare un file binario, con record (o frasi) di uguale lunghezza, con inseriti i vari dati. In base al codice (0,1...) con la funzione fseek puoi creare un file ad accesso diretto.
(In questo caso creo uno struct esempio)

struct prodotto
{
char nome[21];
int codice;
...
}

Chiedi di inserire codice del prodotto
A questo punto apri il file, fai fseek(f,codice*sizeof(prodotto),0)
A questo punto dichiari (es) prodotto p, poi usi
fread(&p,1,sizeof(prodotto),f)
f(puntatore a file, cioè FILE *f) lo inizializzi per aprire il file (f=fopen("es.dat","r+b))
e poi chiudi con fclose(f).
Le funzioni che servono sono in stdlib.h
Per visualizzare p ti basta fare cout di p.nome e avanti così per tutti i dati contenuti nello struct. Scusa se alcune o tutte queste cose le sapevi già, ma non ho tempo di guardare approfonditamente il codice


Credo che a distanza di quasi 10 anni abbia risolto i suoi problemi. C'era addirittura il tempo di imparare ad usare un db sql!

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:50
Domenica, 05/05/2019
Direi che il thread andrebbe chiuso subito.

Bisogna leggerle le date dei thread prima di rispondere


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo