PDA

Visualizza la versione completa : [C] Eliminare elemento FILE


Ronald940
30-07-2014, 18:11
Salve praticamente ho due problemini riscontrati in questo codice:

- Nella funzione cerca mi stampa "Valore non trovato" per gli elementi presenti nel file.. tipo ci sono 3 elementi e mi stampa 3 volte il messaggio.

- Inoltre non riesco a far funzionare la funzione elimina, se conoscete un metodo migliore, io ho trovato solo questo _ (mi crea il file frutta2.txt ma nel programma non funziona lo stesso..)



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tabella{
int cod_prod;
char nome_prod[10];
char tipo_prod[20];
float prezzo;
int cancellato;
};
typedef tabella frutta;
void menu();
void insElemento();
void cercaElemento();
void delElemento();
void visElemento();
int main(){
int comando;
do{
menu();
printf("\nComando:\t");
scanf("%d", &comando);
switch(comando){
case 1:{
insElemento();
break;
}
case 2:{
cercaElemento();
break;
}
case 3:{
delElemento();
break;
}
case 4:{
visElemento();
break;
}
}
}while(true);
return 0;
}
void menu(){
printf("--------------------------");
printf("\n1 - Inserisci Prodotto\n");
printf("2 - Cerca Prodotto\n");
printf("3 - Elimina Prodotto\n");
printf("4 - Visualizza Prodotti\n");
printf("--------------------------");
}
void insElemento(){
int risp;
FILE *fp;
struct tabella frutta;
fp=fopen("frutta.txt","a");
do{
printf("Inserisci il codice del prodotto: ");
scanf("%d", &frutta.cod_prod);
printf("Inserisci il nome del prodotto: ");
scanf("%s", frutta.nome_prod);
printf("Inserisci la tipologia del prodotto: ");
scanf("%s", frutta.tipo_prod);
printf("Inserisci il prezzo del prodotto: ");
scanf("%f", &frutta.prezzo);
fwrite (&frutta, sizeof (struct tabella), 1, fp);

printf("Continuare? 1:SI - 0:NO\t");
scanf("%d", &risp);
}while (risp==1);
fclose(fp);
}
void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
char search[10];
FILE *fp;
struct tabella frutta;
printf("Inserire il nome prodotto da ricercare ");
scanf("%s", search);
fp=fopen("frutta.txt", "r");
while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){

if (!strcmp(frutta.nome_prod, search))
{
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
}
//PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.
/*else{
printf("Elemento non trovato!\n");
}*/
}
}


void delElemento(){
//Cancellazione Logica
int elimina;
FILE *fp;
struct tabella frutta;
printf("Inserire il codice prodotto da eliminare: ");
scanf("%d", &elimina);
fp=fopen("frutta.txt", "r");
int trovato=0;
while ((!trovato) && (!feof(fp))) {
fread(&frutta, sizeof(struct tabella), 1, fp);
if (frutta.cod_prod==elimina){
trovato = 1;
frutta.cancellato=1;
fseek(fp, -sizeof(struct tabella), SEEK_CUR);
fwrite(&frutta, sizeof(struct tabella), 1, fp);
}
}
fclose(fp);
//Cancellazione fisica
FILE *fp1, *fp2;
fp1=fopen("frutta.txt", "r");
fp2=fopen("frutta2.txt", "w");
while(!feof(fp1)){
fread(&frutta, sizeof(struct tabella), 1, fp);
if (!frutta.cancellato)
fwrite(&frutta, sizeof(struct tabella), 1, fp2);
}
fclose(fp1);
fclose(fp2);
remove("frutta.txt");
rename("frutta2.txt","frutta.txt");
}
void visElemento(){
FILE *fp;
struct tabella frutta;
fp=fopen("frutta.txt","r");

while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
}
fclose(fp);
}

torn24
31-07-2014, 10:47
Ti posto le correzioni alla funzione cerca , e alla funzione elimina , commentate nel codice .
L'indentazione inesistente , e non un bel vedere , se un insegnate vedesse codice scritto cosi'
minimo dimezza il voto :D






#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tabella{
int cod_prod;
char nome_prod[10];
char tipo_prod[20];
float prezzo;
int cancellato;
};
typedef struct tabella frutta;
void menu();
void insElemento();
void cercaElemento();
void delElemento();
void visElemento();
int main(){
int comando;
do{
menu();
printf("\nComando:\t");
scanf("%d", &comando);
switch(comando){
case 1:{
insElemento();
break;
}
case 2:{
cercaElemento();
break;
}
case 3:{
delElemento();
break;
}
case 4:{
visElemento();
break;
}
}
}while(1);
return 0;
}
void menu(){
printf("--------------------------");
printf("\n1 - Inserisci Prodotto\n");
printf("2 - Cerca Prodotto\n");
printf("3 - Elimina Prodotto\n");
printf("4 - Visualizza Prodotti\n");
printf("--------------------------");
}
void insElemento(){
int risp;
FILE *fp;
struct tabella frutta;
fp=fopen("frutta.txt","a");
do{
printf("Inserisci il codice del prodotto: ");
scanf("%d", &frutta.cod_prod);
printf("Inserisci il nome del prodotto: ");
scanf("%s", frutta.nome_prod);
printf("Inserisci la tipologia del prodotto: ");
scanf("%s", frutta.tipo_prod);
printf("Inserisci il prezzo del prodotto: ");
scanf("%f", &frutta.prezzo);
fwrite (&frutta, sizeof (struct tabella), 1, fp);

printf("Continuare? 1:SI - 0:NO\t");
scanf("%d", &risp);
}while (risp==1);
fclose(fp);
}
void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
int search;//IL CODICE E' UN NUMERO INTERO
int trovato =0; // Variabile che usiamo come simil bool
FILE *fp;
struct tabella frutta;
printf("Inserire il CODICE del prodotto da ricercare ");
scanf("%d",&search);
fp=fopen("frutta.txt", "r");
while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){

if ( search==frutta.cod_prod)
{
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
trovato=1;
}
//PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.

}

if(!trovato)
printf("Elemento non trovato!\n");

}


void delElemento(){
//Piccole modifice al codice CERCA DI CAPIRLO DA SOLO

/* La logica che hai seguito giusta , ossia creiamo un
file copia , che contiene tutti gli elementi i record , tranne
quello con codice da eliminare , e sucessivamente cancelliamo
il file di origine e rinominiamo il file destinazione, ora quello
che hai sbagliato , e visto che la struttura il record lo devi elinare
non ti devi preuccupare di modificarlo , a te serve solo riconscerolo
tramite codice prodotto */


struct tabella frutta;
printf("Inserire il codice prodotto da eliminare: ");
scanf("%d", &elimina);



//Cancellazione fisica
FILE *fp1, *fp2;
fp1=fopen("frutta.txt", "r");
fp2=fopen("frutta2.txt", "w");
while(!feof(fp1)){
fread(&frutta, sizeof(struct tabella), 1, fp1);
if (frutta.cod_prod!=elimina) //Scrivo tutti i record tranne quello con codice uguale ad elimina
fwrite(&frutta, sizeof(struct tabella), 1, fp2);
}
fclose(fp1);
fclose(fp2);
remove("frutta.txt");
rename("frutta2.txt","frutta.txt");
}
void visElemento(){
FILE *fp;
struct tabella frutta;
fp=fopen("frutta.txt","r");

while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
}
fclose(fp);
}

TheJoeseph
31-07-2014, 11:17
Ti posto le correzioni alla funzione cerca , e alla funzione elimina , commentate nel codice .
L'indentazione inesistente , e non un bel vedere , se un insegnate vedesse codice scritto cosi'
minimo dimezza il voto :D






#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tabella{
int cod_prod;
char nome_prod[10];
char tipo_prod[20];
float prezzo;
int cancellato;
};
typedef struct tabella frutta;
void menu();
void insElemento();
void cercaElemento();
void delElemento();
void visElemento();
int main(){
int comando;
do{
menu();
printf("\nComando:\t");
scanf("%d", &comando);
switch(comando){
case 1:{
insElemento();
break;
}
case 2:{
cercaElemento();
break;
}
case 3:{
delElemento();
break;
}
case 4:{
visElemento();
break;
}
}
}while(1);
return 0;
}
void menu(){
printf("--------------------------");
printf("\n1 - Inserisci Prodotto\n");
printf("2 - Cerca Prodotto\n");
printf("3 - Elimina Prodotto\n");
printf("4 - Visualizza Prodotti\n");
printf("--------------------------");
}
void insElemento(){
int risp;
FILE *fp;
struct tabella frutta;
fp=fopen("frutta.txt","a");
do{
printf("Inserisci il codice del prodotto: ");
scanf("%d", &frutta.cod_prod);
printf("Inserisci il nome del prodotto: ");
scanf("%s", frutta.nome_prod);
printf("Inserisci la tipologia del prodotto: ");
scanf("%s", frutta.tipo_prod);
printf("Inserisci il prezzo del prodotto: ");
scanf("%f", &frutta.prezzo);
fwrite (&frutta, sizeof (struct tabella), 1, fp);

printf("Continuare? 1:SI - 0:NO\t");
scanf("%d", &risp);
}while (risp==1);
fclose(fp);
}
void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
int search;//IL CODICE E' UN NUMERO INTERO
int trovato =0; // Variabile che usiamo come simil bool
FILE *fp;
struct tabella frutta;
printf("Inserire il CODICE del prodotto da ricercare ");
scanf("%d",&search);
fp=fopen("frutta.txt", "r");
while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){

if ( search==frutta.cod_prod)
{
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
trovato=1;
}
//PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.

}

if(!trovato)
printf("Elemento non trovato!\n");

}


void delElemento(){
//Piccole modifice al codice CERCA DI CAPIRLO DA SOLO

/* La logica che hai seguito giusta , ossia creiamo un
file copia , che contiene tutti gli elementi i record , tranne
quello con codice da eliminare , e sucessivamente cancelliamo
il file di origine e rinominiamo il file destinazione, ora quello
che hai sbagliato , e visto che la struttura il record lo devi elinare
non ti devi preuccupare di modificarlo , a te serve solo riconscerolo
tramite codice prodotto */


struct tabella frutta;
printf("Inserire il codice prodotto da eliminare: ");
scanf("%d", &elimina);



//Cancellazione fisica
FILE *fp1, *fp2;
fp1=fopen("frutta.txt", "r");
fp2=fopen("frutta2.txt", "w");
while(!feof(fp1)){
fread(&frutta, sizeof(struct tabella), 1, fp1);
if (frutta.cod_prod!=elimina) //Scrivo tutti i record tranne quello con codice uguale ad elimina
fwrite(&frutta, sizeof(struct tabella), 1, fp2);
}
fclose(fp1);
fclose(fp2);
remove("frutta.txt");
rename("frutta2.txt","frutta.txt");
}
void visElemento(){
FILE *fp;
struct tabella frutta;
fp=fopen("frutta.txt","r");

while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
}
fclose(fp);
}











Ciao Torn24, potresti farmi capire perch nella funzione cercaElemento() alla fine metti if(!trovato){.....}? non riesco a capirlo...

grazie

torn24
31-07-2014, 11:41
void cercaElemento(){
int search;//IL CODICE E' UN NUMERO INTERO
int trovato =0; // Variabile che usiamo come simil bool
FILE *fp;
struct tabella frutta;
printf("Inserire il CODICE del prodotto da ricercare ");
scanf("%d",&search);
fp=fopen("frutta.txt", "r");
while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){

if ( search==frutta.cod_prod)
{
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
trovato=1;
}


}//End while

/*Nel ciclo while , controlliamo ogni struttura-record , se troviamo il record con codice p rodotto voluto stampiamo il record , e mettiamo a valore 1 la variabile trovato
se la variabile trovato==1 ho trovato il record e NON STAMPO ELEMENTO NON TROVATO
se la variabile resta a valore 0 allora non ho stampato e non ho trovato il record.
================================================== ======================================

in C , 0 = falso , diverso da zero "in questo caso" 1 =vero ,
(!trovato) uguale a ! (non 1 ),non vero, ossia uguale a zero , la condizione pertanto la posso scrivere if(trovato==0) , di solito uso la forma pi chiara , ma non so come
mai mi venuto di scrivere cosi :D
*/
if(!trovato)
printf("Elemento non trovato!\n");

}

Ronald940
31-07-2014, 11:55
Grande, funziona tutto alla perfezione!
P.S. La prof vuole i compiti scritti sulla carta, quindi non ho problemi di indentazione! ahahah :D

TheJoeseph
31-07-2014, 11:55
void cercaElemento(){
int search;//IL CODICE E' UN NUMERO INTERO
int trovato =0;// Variabile che usiamo come simil bool
FILE *fp;
struct tabella frutta;
printf("Inserire il CODICE del prodotto da ricercare ");
scanf("%d",&search);
fp=fopen("frutta.txt","r");
while(fread(&frutta,sizeof(struct tabella),1, fp)>0){

if( search==frutta.cod_prod)
{
printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n", frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
trovato=1;
}


}//End while

/*Nel ciclo while , controlliamo ogni struttura-record , se troviamo il record con codice p rodotto voluto stampiamo il record , e mettiamo a valore 1 la variabile trovato
se la variabile trovato==1 ho trovato il record e NON STAMPO ELEMENTO NON TROVATO
se la variabile resta a valore 0 allora non ho stampato e non ho trovato il record.
================================================== ======================================

in C , 0 = falso , diverso da zero "in questo caso" 1 =vero ,
(!trovato) uguale a ! (non 1 ),non vero, ossia uguale a zero , la condizione pertanto la posso scrivere if(trovato==0) , di solito uso la forma pi chiara , ma non so come
mai mi venuto di scrivere cosi :D
*/
if(!trovato)
printf("Elemento non trovato!\n");

}















Adesso tutto chiaro! comunque devo chiederti un altro favore... potresti dare un'occhiata alla mia ultima discussione? (quella sulla compilazione della lista di stringhe)

grazie

Loading