PDA

Visualizza la versione completa : [C] Problema FILE


luanlombardi
28-08-2008, 19:11
Salve ragazzi, allego il programma che sto progettando: una sorta di palinsesto TV (banale)

/*
programma palinsesto partite
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#define MAX 3000

//creo la struttura
typedef struct {
char programma[MAX];
char reti[MAX];
float ora;
} palinsesto;

//funzioni
void wpalinsesto();
void rpalinsesto();
void ordina_pal();
void cancella_pal();
void restituiscidesiderato();
void pausa();

//main()
main() {
int scelta;

for( ; ; ) //for infinito per il menu
{
printf("###MENU PALINSESTO PARTITE###\n");
printf("1 Inserisci Programma nel Palinsesto\n");
printf("2 Leggi Palinsesto\n");
printf("3 Ordina Palinsesto\n");
printf("4 Leggi Palinsesto desiderato\n");
printf("5 Cancella Palinsesto desidetato\n");
printf("6 Esci\n");
printf("##############################\n");

printf("Inserisci la tua scelta\n");
scanf("%i", &scelta);
scelta = (int)scelta;

if(scelta == 1)
{
wpalinsesto();
}
if(scelta == 2)
{
rpalinsesto();
}
if(scelta == 3)
{
ordina_pal();
}
if(scelta == 4)
{
restituiscidesiderato();
}
if(scelta == 5)
{
cancella_pal();
}
if(scelta ==6)
{
exit(1);

}
if(scelta >=7 )
{
system("cls");
}
} //chiusura for
}//chiusura main


//funzioni
/* wpalinsesto: scrivi sul file di testo palinsesto.dat i dati
delle partite
*/
void wpalinsesto()
{
palinsesto p;
FILE *fp;

if(!(fp=fopen("palinsesto.txt","ab"))) {
printf("Impossibile scrivere sul file\n");
pausa();
} else {
fflush(stdin);
printf("Inserisci il Programma\n");
scanf("%s", p.programma);
printf("Inserisci la rete\n");
scanf("%s", p.reti);
printf("Inserisci l'ora\n");
scanf("%f",&p.ora);

fwrite(&p,sizeof(palinsesto),1,fp);
printf("Scrittura avvenuta con successo\n");

fclose(fp);
} //chiusura if...else

} //end

/*
rpalinsesto: leggi il file palinsesto.dat
*/
void rpalinsesto()
{
palinsesto p;
FILE *fp;

if(!(fp=fopen("palinsesto.txt","rb"))) {
printf("Impossibile leggere il file\n");
pausa();
} else {
while(fread(&p,sizeof(palinsesto),1,fp) > 0) {

printf("Programma > %s\n", p.programma);
printf("Rete > %s\n", p.reti);
printf("Ora > %f\n",p.ora);
}
}
fclose(fp);

}//end

/*
ordina: ordina le partite del palinsesto in base all'ora
*/
void ordina_pal()
{
}

/*
restituiscidesiderato : restituisce il palinsesto desiderato in base al programma
*/
void restituiscidesiderato()
{
palinsesto p;
FILE *fp;
char prog[MAX];

if(!(fp=fopen("palinsesto.txt","ab"))) {
printf("Impossibile proseguire\n");
pausa();
} else {
printf("Inserisci il programma che vuoi modificare\n");
scanf("%s",&prog);
while(fread(&p,sizeof(palinsesto),1,fp)){


if(strcmp(prog,p.programma)==0) {
printf("Hai scelto il programma: %s", prog);
printf("\n");
printf("Inserisci il nuovo nome\n");
fflush(stdin);
scanf("%s", p.programma);
printf("Inserisci la rete\n");
scanf("%s", p.reti);
printf("Inserisci l'ora\n");
scanf("%d",&p.ora);

fwrite(&p,sizeof(palinsesto),1,fp);

printf("Programma modificato\n");
} else {
printf("Programma non trovato\n");
pausa();
}
}
}
fclose(fp);
}//end


/*
cancella_pal: cancella palinsesto desiderato
*/
void cancella_pal()
{
palinsesto p;
FILE *fp;
FILE *fp1;
char prog[MAX];


if(!(fp=fopen("palinsesto.txt","rb"))) {
printf("Impossibile accedere al file\n");
pausa();
} else {
printf("Inserisci il programma da cancellare\n");
scanf("%s",&prog);
fp1 = fopen("temp.dat","wb");
while(fread(&p,sizeof(palinsesto),1,fp) != 0) {
while(strcmp(prog,p.programma) != 0) {
fwrite(&p,sizeof(palinsesto),1,fp1);
fclose(fp);
fclose(fp1);
rename("temp.dat","palinsesto.dat");
printf("Scrittura avvenuta con successo\n");
}
}
}

}

/*
pausa: ferma lo schermo finch non si preme il tasto invio
*/
void pausa()
{
char invio;
printf("Premere INVIO per continuare\n");
invio = getchar();
return;
}

Un'altra cosa: la funzione ordina() come dovrei scriverla? Se la faccio con i puntatori dovrei inserire anche una lista...
:bh:

Attendo una risposta...nel frattempo vi ringrazio anticipatamente

MItaly
28-08-2008, 19:13
Usa la funzione qsort().

luanlombardi
28-08-2008, 19:22
Ma come ultimo parametro devo metterci una funzione che restituisce 1 o -1 o sbaglio?

MItaly
28-08-2008, 19:36
S (o meglio, non necessariamente -1, 0 o 1, ma pi semplicemente un valore inferiore, uguale o superiore a 0); trovi qui (http://forum.html.it/forum/showthread.php?s=&postid=11848719#post11848719) un esempio.

luanlombardi
28-08-2008, 19:45
Originariamente inviato da MItaly
S (o meglio, non necessariamente -1, 0 o 1, ma pi semplicemente un valore inferiore, uguale o superiore a 0); trovi qui (http://forum.html.it/forum/showthread.php?s=&postid=11848719#post11848719) un esempio.

ok grazie!
E per il codice? Cosa c' che non va?
Non riesce a modificare e a cancellare una struttura... :bh:

luanlombardi
29-08-2008, 10:33
Nessuno? :incupito: suppongo vada bene? :bh:

Metflar
29-08-2008, 10:41
per la scelta usa uno switch + comodo :ciauz:

luanlombardi
29-08-2008, 14:04
Ho rivisto il codice...le funzioni che modificano e cancellano il palinsesto desiderato funzionano solamente se c' un solo palinsesto nel file..altrimenti no.



/*
programma palinsesto partite
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#define MAX 3000

//creo la struttura
typedef struct {
char programma[MAX];
char reti[MAX];
char ora[MAX];
} palinsesto;

//funzioni
void wpalinsesto();
void rpalinsesto();
int ordina_pal(const void *p1,const void *p2);
void cancella_pal();
void modificadesiderato();
void pausa();
void cancella_tutto();

//main()
main() {
int scelta;
palinsesto p;

for( ; ; ) //for infinito per il menu
{
printf("###MENU PALINSESTO PARTITE###\n");
printf("1 Inserisci Programma nel Palinsesto\n");
printf("2 Leggi Palinsesto\n");
printf("3 Ordina Palinsesto\n");
printf("4 Modifica Palinsesto desiderato\n");
printf("5 Cancella Palinsesto desidetato\n");
printf("7 Cancella tutto\n");
printf("6 Esci\n");
printf("##############################\n");

printf("Inserisci la tua scelta\n");
scanf("%i", &scelta);
scelta = (int)scelta;

if(scelta == 1)
{
wpalinsesto();
}
if(scelta == 2)
{
rpalinsesto();
}
if(scelta == 3)
{
qsort(&p,1,sizeof(palinsesto),ordina_pal);
}
if(scelta == 4)
{
modificadesiderato();
}
if(scelta == 5)
{
cancella_pal();
}
if(scelta ==6)
{
exit(1);

}
if(scelta == 7)
{
cancella_tutto();
}
if(scelta >=8 )
{
system("cls");
}
} //chiusura for
}//chiusura main


//funzioni
/* wpalinsesto: scrivi sul file di testo palinsesto.dat i dati
delle partite
*/
void wpalinsesto()
{
palinsesto p;
FILE *fp;

if(!(fp=fopen("g:/palinsesto.txt","a"))) {
printf("Impossibile scrivere sul file\n");
pausa();
} else {
fflush(stdin);
printf("Inserisci il Programma\n");
scanf("%s", p.programma);
printf("Inserisci la rete\n");
scanf("%s", p.reti);
printf("Inserisci l'ora\n");
scanf("%s",p.ora);

fprintf(fp,"%s\t%s\t%s\n",p.programma, p.reti,p.ora);
printf("Scrittura avvenuta con successo\n");

fclose(fp);
} //chiusura if...else

} //end

/*
rpalinsesto: leggi il file palinsesto.dat
*/
void rpalinsesto()
{
palinsesto p;
FILE *fp;

if(!(fp=fopen("g:/palinsesto.txt","r"))) {
printf("Impossibile leggere il file\n");
pausa();
} else {
while(fscanf(fp,"%s\t%s\t%s\n",p.programma, p.reti,p.ora) > 0) {

printf("Programma > %s\n", p.programma);
printf("Rete > %s\n", p.reti);
printf("Ora > %s\n",p.ora);
}
}
fclose(fp);

}//end

/*
ordina: ordina le partite del palinsesto in base all'ora
*/
int ordina_pal(const void *p1,const void *p2)
{
palinsesto *s1 = (palinsesto *) p1;
palinsesto *s2 = (palinsesto *) p2;

if(s1->ora < s2->ora) {
return 1;
}
return -1;
}

/*
restituiscidesiderato : restituisce il palinsesto desiderato in base al programma
*/
void modificadesiderato()
{
palinsesto p;
FILE *fp;
char prog[MAX];
int pos;



if(!(fp=fopen("g:/palinsesto.txt","r+"))) {
printf("Impossibile proseguire\n");
pausa();
} else {
rewind(fp);
printf("%i\n", pos);
printf("Inserisci il programma che vuoi modificare\n");
scanf("%s",&prog);



while(feof(fp) != 0) {

if(strcmp(prog,p.programma)==0) {
printf("Hai scelto il programma: %s", prog);
printf("\n");

fflush(stdin);
printf("Inserisci il nome del programma\n");
scanf("%s", p.programma);
printf("Inserisci la rete\n");
scanf("%s", p.reti);
printf("Inserisci l'ora\n");
scanf("%s",p.ora);
pos = ftell(fp);
fseek(fp,pos,SEEK_CUR);
if(fprintf(fp,"%s\t%s\t%s\n", p.programma,p.reti,p.ora) > 0) {
printf("Programma modificato\n");
exit(1);

} else {
printf("Programma non modificato");
pausa();

}
} else {
printf("Programma non trovato\n");
pausa();

}
}
}

fclose(fp);
}//end


/*
cancella_pal: cancella palinsesto desiderato
*/
void cancella_pal()
{
palinsesto p;
FILE *fp;
FILE *fp1;
char prog[MAX];


if(!(fp=fopen("g:/palinsesto.txt","r+"))) {
printf("Impossibile accedere al file\n");
pausa();
} else {
printf("Inserisci il programma da cancellare\n");
scanf("%s",&prog);

fseek(fp,1,SEEK_SET);

//se prog diverso dal programma desiderato
if(strcmp(prog,p.programma) ==0) {
//apri il file temp
fp1 = fopen("g:/temp.txt","w+");
while(!feof(fp)) {
//scrivi sul file temp i programmi
fprintf(fp1,"%s\t%s\t%s\n",p.programma, p.reti,p.ora);
printf("Scrittura avvenuta con successo\n");
break;
}
//chiude i due file
fclose(fp);
fclose(fp1);
//rimuove il palinsesto
remove("g:/palinsesto.txt");
//rinomina il file temp
rename("g:/temp.txt","g:/palinsesto.txt");
remove("g:/temp.txt");

} else {

printf("Programma non trovato\n");
pausa();


}


}

}

/*
pausa: ferma lo schermo finch non si preme il tasto invio
*/
void pausa()
{
char invio;
printf("Premere INVIO per continuare\n");
invio = getchar();
return;
}

/*
cancella tutto il file
*/
void cancella_tutto()
{
FILE *fp;

fp = fopen("g:/palinsesto.txt","r");
if( remove( "g:/palinsesto.txt" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return;
}



come potrei risolvere questo inconveniente? :bh:

mondobimbi
29-08-2008, 16:23
ho dato una occhiata e faccio le mie considerazioni sperando ti siano utili
1 - fai attenzione all'indentazione, cerca di scegliere uno stile di scrittura e poi seguilo
2 - la funzione main deve ritornare un int e questo sempre meglio che sia esplicitato (anche se non indicarlo era lecito per le prime versioni del C).
3 - si esce dal programma con l'istruzione return e non exit, exit normalmente si usa per una uscita anomala dal programma. Ricordati che exit (0) vuol dire uscita corretta e exit (1) o altro intero uscita anomala.

per quanto riguarda il problema della cancellazione del record, effettivamente questa funzione non scritta correttamente. Ci sono moltissimi modi per implementarla, prova a postare la sequenza di operazioni come pensavi di eseguirle. P. es 1-apro il file ... 2-leggo tutti i record del file ecc.

ti ho inserito qualche considerazione



/*
programma palinsesto partite
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 3000

//creo la struttura
typedef struct {

char programma[MAX];
char reti[MAX];
char ora[MAX];
} palinsesto ;


// dichiarazioni delle funzioni
void wpalinsesto();
void rpalinsesto();
int ordina_pal(const void *p1, const void *p2);
void cancella_pal();
void modificadesiderato();
void pausa();
void cancella_tutto();

//main()
int main() {

int scelta;
palinsesto p;

for( ; ; ) //for infinito per il menu
{
printf("###MENU PALINSESTO PARTITE###\n");
printf("1 Inserisci Programma nel Palinsesto\n");
printf("2 Leggi Palinsesto\n");
printf("3 Ordina Palinsesto\n");
printf("4 Modifica Palinsesto desiderato\n");
printf("5 Cancella Palinsesto desidetato\n");
printf("7 Cancella tutto\n");
printf("6 Esci\n");
printf("##############################\n");

printf("Inserisci la tua scelta\n");
scanf("%i", &scelta);
scelta = (int)scelta;

// guarda se eventualmente sostituire con uno switch
if ( scelta == 1 ) {
wpalinsesto();
}
else if ( scelta == 2 ) {
rpalinsesto();
}
else if ( scelta == 3 ) {
qsort(&p,1,sizeof(palinsesto),ordina_pal);
}
else if ( scelta == 4 ) {
modificadesiderato();
}
else if ( scelta == 5 ) {
cancella_pal();
}
else if ( scelta == 6 ) {
// esci dal loop
// exit (1) identifica una uscita non corretta
break ;
}
else if ( scelta == 7 ) {
system("cls");
}
else
// la scelta non corretta, eventualmente gestiscilo
;


} //chiusura for

// deve esserci sempre
return ( 0 );

}//chiusura main


//funzioni
/* wpalinsesto: scrivi sul file di testo palinsesto.dat i dati
delle partite
*/
void wpalinsesto()
{

palinsesto p;
FILE *fp;

if ( !( fp = fopen("./palinsesto.txt","a") ) ) {

printf("Impossibile scrivere sul file\n");
pausa();
}
else {

fflush(stdin);
printf("Inserisci il Programma\n");
scanf("%s", p.programma);
printf("Inserisci la rete\n");
scanf("%s", p.reti);
printf("Inserisci l'ora\n");
scanf("%s",p.ora);

fprintf(fp,"%s\t%s\t%s\n",p.programma, p.reti,p.ora);
printf("Scrittura avvenuta con successo\n");

fclose(fp);
} //chiusura if...else
// il commento "chiusura if...else" inutile, i commenti servono
// per scrivere cosa si ha intenzione di fare

} //end

/*
rpalinsesto: leggi il file palinsesto.dat
*/
void rpalinsesto()
{

palinsesto p;
FILE *fp;

if( !( fp = fopen("./palinsesto.txt","r") ) ) {
printf("Impossibile leggere il file\n");
pausa();
} else {
while(fscanf(fp,"%s\t%s\t%s\n",p.programma, p.reti,p.ora) > 0) {

printf("Programma > %s\n", p.programma);
printf("Rete > %s\n", p.reti);
printf("Ora > %s\n",p.ora);
}
}

fclose(fp);

}//end

/*
ordina: ordina le partite del palinsesto in base all'ora
*/
int ordina_pal(const void *p1,const void *p2)
{

palinsesto *s1 = (palinsesto *) p1;
palinsesto *s2 = (palinsesto *) p2;

// cos gestisci anche l'==
return ( s2->ora - s1->ora );

}

/*
restituiscidesiderato : restituisce il palinsesto desiderato in base al programma
*/
void modificadesiderato()
{

palinsesto p;
FILE *fp;

char prog[MAX];
int pos;



if(!(fp=fopen("./palinsesto.txt","r+"))) {
printf("Impossibile proseguire\n");
pausa();
}
else {

rewind(fp);
printf("%i\n", pos);
printf("Inserisci il programma che vuoi modificare\n");
scanf("%s",&prog);

while(feof(fp) != 0) {

if( strcmp ( prog, p.programma) == 0 ) {

printf("Hai scelto il programma: %s", prog);
printf("\n");

fflush(stdin);
printf("Inserisci il nome del programma\n");
scanf("%s", p.programma);
printf("Inserisci la rete\n");
scanf("%s", p.reti);
printf("Inserisci l'ora\n");
scanf("%s",p.ora);
pos = ftell(fp);
fseek(fp,pos,SEEK_CUR);

if(fprintf(fp,"%s\t%s\t%s\n", p.programma,p.reti,p.ora) > 0) {
printf("Programma modificato\n");
return ;
}
else {
printf("Programma non modificato");
pausa();

}
} else {
printf("Programma non trovato\n");
pausa();
}
}
}

fclose(fp);

}//end


/*
cancella_pal: cancella palinsesto desiderato
*/
void cancella_pal()
{

palinsesto p;

FILE *fp;
FILE *fp1;

char prog[MAX];


if( !( fp = fopen("./palinsesto.txt", "r+") ) ) {
printf("Impossibile accedere al file\n");
pausa();
}
else {

printf("Inserisci il programma da cancellare\n");
scanf("%s",&prog);

fseek ( fp,1,SEEK_SET );

//se prog diverso dal programma desiderato
if ( strcmp(prog, p.programma) == 0 ) {

//apri il file temp
fp1 = fopen("./temp.txt","w+");
//scrivi sul file temp i programmi
fprintf(fp1,"%s\t%s\t%s\n",p.programma, p.reti,p.ora);
printf("Scrittura avvenuta con successo\n");

//chiude i due file
fclose(fp);
fclose(fp1);
//rimuove il palinsesto
remove("./palinsesto.txt");

//rinomina il file temp
rename("./temp.txt", "./palinsesto.txt");
remove("./temp.txt");

}
else {

printf("Programma non trovato\n");
pausa();

}

}

}

/*
pausa: ferma lo schermo finch non si preme il tasto invio
*/
void pausa()
{

char invio;
printf("Premere INVIO per continuare\n");
invio = getchar();
return;
}

/*
cancella tutto il file
*/
void cancella_tutto()
{

FILE *fp;

fp = fopen("./palinsesto.txt","r");
if( remove( "./palinsesto.txt" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );

return;

}


ciao
sergio

luanlombardi
29-08-2008, 16:56
Cosi la funzione cancella tutto:


void cancella_tutto()
{
FILE *fp;
palinsesto p;

fp = fopen("g:/palinsesto.txt","r");
rewind(fp);
fread(&p,sizeof(palinsesto),1,fp);
fclose(fp);
if( remove( "g:/palinsesto.txt" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return;
}


Per quanto riguarda le altre...modifica e cancella desiderato..non funzionano e non capisco proprio perch :bh:

Loading