PDA

Visualizza la versione completa : Ricerca di una stringa in un file


Pisno123
08-06-2016, 10:26
Ciao ragazzi,
ho un urgente bisogno di voi, ho questo codice dove devo ricercare una parola in un file che memorizza i dati che l'utente ha inserito precedentemente. come si fa?

codice
--------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main()
{
struct s_protocollo
{
char cliente[20];
char tipo[20];
char entrata[20];
int anno;
};
int scelta,vero,i,conto=0,numero=0;
char ipotesi[200],x, *res;
typedef struct s_protocollo proto;
proto protocollo[100];
FILE *file;

file=fopen("protocolli.txt","a+");



do
{

printf("1) Aggiungi un nuovo protocollo\n") ;
printf("2) Ricerca esatta \n") ;
printf("3) Stampa completa \n") ;
printf("0) Salva tutti i protocolli ed esci\n") ;

printf ("Inserisci scelta: ");
scanf ("%d", &scelta);

switch (scelta)
{
default:
printf("Errore");
conto++;
break;


case 0:
printf("bye");
return 0;
break;

case 1:
printf("Inserisci il tipo: ");
scanf("%s", protocollo[conto].tipo);
fprintf(file,"Tipo: %s\n",protocollo[conto].tipo);
printf("Inserisci se è cliente o fornitore: ");
scanf("%s",protocollo[conto].cliente);
fprintf(file,"Cliente o fornitore: %s\n",protocollo[conto].cliente);
printf("Inserisci se e' entrata o uscita: ");
scanf("%s",protocollo[conto].entrata);
fprintf(file,"Entrata o uscita: %s\n",protocollo[conto].entrata);
printf("Inserisci l'anno: ");
scanf("%d",&protocollo[conto].anno);
fprintf(file,"Anno: %d\n",protocollo[conto].anno);
numero++;
printf("Questo e' il numero di protocollo: %d2016\n",numero);
fprintf(file,"Numero: %d2016\n\n\n",numero);
conto++;
break;


case 2:
printf("Inserisci il tipo di protocollo: ");
scanf("%s",ipotesi);


for (i=0;i<conto;i++)
{
if(strcmp(ipotesi,protocollo[i].tipo)==0)
{
vero++;
}
if(vero==1)
{
printf("Ecco i dati del protocollo trovato: \n");
printf("Tipo di protocollo: %s\n",protocollo[i].tipo);
printf("Cliente o Fornitore: %s\n",protocollo[i].cliente);
printf("Entrata o uscita: %s\n",protocollo[i].entrata);
printf("Anno: %d\n",protocollo[i].anno);
printf("Numero di protocollo: %d2016\n",i+1);
}
if(vero==0)
{
printf("non ho trovato nessun protocollo");
}
}
break;


case 3:
while ((x = getc(file)) != EOF)
putchar(x);
break;


}


}while(scelta!=0);
}

oregon
08-06-2016, 10:41
In generale,

apri il file

leggi riga per riga

confronti con il dato cercato

continui con la prossima riga se non hai trovato, visualizzi il risultato in caso contrario

Pisno123
08-06-2016, 10:48
Potresti perfavore darmi il frammento di codice?

oregon
08-06-2016, 10:52
No, perché non è proprio un "frammento" e dipende molto da tutto il resto del tuo codice ...

Prova a scrivere tu qualcosa in base a quello che ti ho detto e si vede di darti consigli e proporre correzioni.

Pisno123
08-06-2016, 10:57
ok, come faccio a leggere riga per riga?

Pisno123
08-06-2016, 10:58
Che errori ci sono?

case 2:
printf("Inserisci il tipo di protocollo: ");
scanf("%s",ipotesi);

while (!feof(file))
{
if (strcmp(ipotesi,protocollo[conto].tipo)==0)
{
fscanf(file, "%s", ipotesi);
printf("\nHo trovato %s!\n", protocollo[conto].tipo );
cont++;
}

}

oregon
08-06-2016, 11:04
Se hai già usato il file per scrivere, è meglio chiudere e aprire nuovamente per leggere.

La lettura dei dati va fatta prima di confrontare, altrimenti cosa confronti?

Pisno123
08-06-2016, 11:07
Non è cosi?
case 2:
printf("Inserisci il tipo di protocollo: ");
scanf("%s",ipotesi);
file=fopen ("protocolli.txt","r");
while (!feof(file))
{
fscanf(file, "%s", ipotesi);
if (strcmp(ipotesi,protocollo[conto].tipo)==0)
{
printf("\nHo trovato %s!\n", protocollo[conto].tipo );
cont++;
}

}

oregon
08-06-2016, 11:42
"ipotesi" serve a leggere quello che vuoi cercare da tastiera.

Se cerchi da file, devi usare un'altra variabile per leggere i dati da file non la variabile "ipotesi"

Il confronto va fatto tra la variabile "ipotesi" e quello che leggi da file, non con i dati nel vettore "protocollo".

A meno che tu non decida di gestire TUTTO in memoria e allora non devi aprire il file e leggere dal file ma semplicemente in un ciclo for con i dati presenti nel vettore "protocollo".

Insomma, prima di scrivere codice, devi decidere come deve lavorare il tuo programma.

Loading