[C] aiuto su programma
ciao a tutti ho difficoltà a svolgere questo esercizio,spero che qualcuno possa aiutarmi:
la traccia è inserimento dati paseggeri e ricerca con stampa dei passeggeri diretti a roma dalle 15 alle 19.
grazie tante per l'aiuto..
io ho provato a svolgerlo così:
la traccia è inserimento dati paseggeri e ricerca con stampa dei passeggeri diretti a roma dalle 15 alle 19.
grazie tante per l'aiuto..

io ho provato a svolgerlo così:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "voli.h" FILE * fp; typedef struct { char nome_cognome[20]; int volo; char citta_arrivo[15]; int orario; }prenotazione; prenotazione mia_prenotazione; int main() { char operazione; do { printf("\n *****************************"); printf("\n MENU\n "); printf("\n 1:INSERIMENTO PRENOTAZIONE\n"); printf("\n 2:STAMPA NUM. TOTALE VOLI PER ROMA\n"); printf("\n 3:ESC\n"); printf("\n *****************************\n"); scanf("%c",&operazione); switch(operazione) { case '1':inserisci(); break; case '2':stampa(); break; } } while (operazione!='3'); } void inserisci() { printf("\n inserimento nome paseggero\n"); scanf("%s",mia_prenotazione.nome_cognome); printf("\n inserimento volo\n"); scanf("%d",&mia_prenotazione.volo); printf("\n inserimento destinazione\n"); scanf("%s",mia_prenotazione.citta_arrivo); printf("\n inserimento orario arrivo\n"); scanf("%d",&mia_prenotazione.orario); if ((fp=fopen("File.txt","a"))== NULL) { printf("Impossibile aprire il file\n"); exit(1); } fwrite(&mia_prenotazione,sizeof(prenotazione),1,fp); fclose(fp); } void stampa() { if ((fp=fopen("File.txt","a"))== NULL) { printf("Impossibile aprire il file\n"); exit(1); } int voli=0; while(fread(&mia_prenotazione,sizeof(prenotazione),1,fp)); if(strcmp(mia_prenotazione.citta_arrivo,"Roma")==0 && mia_prenotazione.orario>15 && mia_prenotazione.orario<19); { voli=voli+1; } printf("\nil numero totale dei voli per Roma:\n"); printf("%d",voli); fclose(fp); system("pause"); }
Risposte
Ciao.
Mi sono iscritto solo ieri, ed è per questo che ti rispondo solo ora.
Non so se hai già risolto, comunque, ad una prima occhiata, dovresti avere problemi durante la stampa dei dati.
Questo perchè apri il file in modalità testuale invece che in binario.
In pratica, invece di aprire il file così:
fopen("File.txt","a")
aprilo in quest altra maniera:
fopen("File.txt","ab")
(la b sta per binario)
Questo ogni volta che lo apri.
Ciao!
Mi sono iscritto solo ieri, ed è per questo che ti rispondo solo ora.
Non so se hai già risolto, comunque, ad una prima occhiata, dovresti avere problemi durante la stampa dei dati.
Questo perchè apri il file in modalità testuale invece che in binario.
In pratica, invece di aprire il file così:
fopen("File.txt","a")
aprilo in quest altra maniera:
fopen("File.txt","ab")
(la b sta per binario)
Questo ogni volta che lo apri.
Ciao!
ciao grazie tante per avermi risposto
il problema e che il punto *VISUALIZZARE A VIDEO DI TUTTE LE PRENOTAZIONI QUELLE DEL PRIMO ANNO,li visualizzo solo una volta poi se ripremo non vedo nulla.
il terzo punto*VISUALIZZARE A VIDEO LE AULE PRENOTATE NELLA FASCIA ORARIA DALLE 10:00 ALLE 13:00,visualizza tutte le informazioni inserite .
spero tu mi possa aiutare
il problema e che il punto *VISUALIZZARE A VIDEO DI TUTTE LE PRENOTAZIONI QUELLE DEL PRIMO ANNO,li visualizzo solo una volta poi se ripremo non vedo nulla.
il terzo punto*VISUALIZZARE A VIDEO LE AULE PRENOTATE NELLA FASCIA ORARIA DALLE 10:00 ALLE 13:00,visualizza tutte le informazioni inserite .
spero tu mi possa aiutare

il problema e che il punto *VISUALIZZARE A VIDEO DI TUTTE LE PRENOTAZIONI QUELLE DEL PRIMO ANNO,li visualizzo solo una volta poi se ripremo non vedo nulla.
il terzo punto*VISUALIZZARE A VIDEO LE AULE PRENOTATE NELLA FASCIA ORARIA DALLE 10:00 ALLE 13:00,visualizza tutte le informazioni inserite .
spero tu mi possa aiutare
Mi pare ci sia un pò di confusione... perchè mi parli di aule se l'esercizio era sulle prenotazioni voli?

si scusa tanto avevo anche chiesto aiuto sul seguente programma:
*********************
si rediga un programma in C di gestione prenotazione aule *//
//struttura contiene: *//
//-->aula (char) *//
//-->nome esame(char 30) *//
//-->cognome docente(char 30) *//
//-->anno corso(int) *//
//-->ora inizio lezione(int ora int minuti) *//
//-->tempo della prova(int) *//
//Richiesta: *//
//1)INSERIMENTO NUOVI RECORD *//
//2)VISUALIZZARE A VIDEO DI TUTTE LE PRENOTAZIONI QUELLE DEL PRIMO ANNO *//
//3)VISUALIZZARE A VIDEO LE AULE PRENOTATE NELLA FASCIA ORARIA DALLE 10:00 ALLE 13:00 *//
//***************************************************************************************//
#include
#include
#include
typedef struct prenotazione
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;
prenotazione mia_prenotazione;
//prototipo delle funzioni//
void inserimento(FILE **); // MODIFICA in tutte le funzioni
void ricerca(FILE **); // passo il riferimento al file di lavoro.
void visualizza(FILE **);
int contatore=0;//
int main(int argv, char *argc[])
{
int operazione;
FILE *fp;
fp=fopen("C:\\file.txt","r+b");
if (!fp)
{
// Se il file non esiste
fp=fopen("C:\\file.txt", "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("\nSCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
visualizza(&fp);
break;
}
}
} while (operazione<=3);
return 0;
}
void inserimento(FILE **g)
{
FILE *fp;
fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
printf("\n inserire aula\n");
scanf("%s", &mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s", &mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s", &mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);
contatore=contatore+1;
fclose(fp);
}
void ricerca(FILE **g)
{
int conta;
//FILE *fp;
//fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)==1)
if(mia_prenotazione.anno==1)
{
printf("\n------------------------------------------------------\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
printf("\n------------------------------------------------------\n");
conta=1;
}
//fclose(fp);
return ;
}
void visualizza(FILE **g)
{
//FILE *fp;
//fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
while (fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g)==0);
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
//fclose(fp);
}

*********************
si rediga un programma in C di gestione prenotazione aule *//
//struttura contiene: *//
//-->aula (char) *//
//-->nome esame(char 30) *//
//-->cognome docente(char 30) *//
//-->anno corso(int) *//
//-->ora inizio lezione(int ora int minuti) *//
//-->tempo della prova(int) *//
//Richiesta: *//
//1)INSERIMENTO NUOVI RECORD *//
//2)VISUALIZZARE A VIDEO DI TUTTE LE PRENOTAZIONI QUELLE DEL PRIMO ANNO *//
//3)VISUALIZZARE A VIDEO LE AULE PRENOTATE NELLA FASCIA ORARIA DALLE 10:00 ALLE 13:00 *//
//***************************************************************************************//
#include
#include
#include
typedef struct prenotazione
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;
prenotazione mia_prenotazione;
//prototipo delle funzioni//
void inserimento(FILE **); // MODIFICA in tutte le funzioni
void ricerca(FILE **); // passo il riferimento al file di lavoro.
void visualizza(FILE **);
int contatore=0;//
int main(int argv, char *argc[])
{
int operazione;
FILE *fp;
fp=fopen("C:\\file.txt","r+b");
if (!fp)
{
// Se il file non esiste
fp=fopen("C:\\file.txt", "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("\nSCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
visualizza(&fp);
break;
}
}
} while (operazione<=3);
return 0;
}
void inserimento(FILE **g)
{
FILE *fp;
fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
printf("\n inserire aula\n");
scanf("%s", &mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s", &mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s", &mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);
contatore=contatore+1;
fclose(fp);
}
void ricerca(FILE **g)
{
int conta;
//FILE *fp;
//fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)==1)
if(mia_prenotazione.anno==1)
{
printf("\n------------------------------------------------------\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
printf("\n------------------------------------------------------\n");
conta=1;
}
//fclose(fp);
return ;
}
void visualizza(FILE **g)
{
//FILE *fp;
//fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
while (fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g)==0);
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
//fclose(fp);
}
Ci sono vari errori nel programma.
Hai dichiarato una variabile globale prenotazione mia_prenotazione, e poi ridichiari un'altra variabile con lo stesso nome sia nella funzione ricerca, che nella funzione visualizza. Ciò può creare problemi (e lo farà, fidati!
)
Per quanto riguarda il primo problema, che li visualizza solo una volta, quella è colpa del cursore
Ad ogni FILE è associato un valore chiamato cursore, che indica l'attuale posizione (o meglio il byte) all'interno del file.
Quando apri un file, il cursore è all'inizio del file.
fread prende come riferimento il cursore per iniziare a lavorare.
In pratica, tu leggi la prima volta, e il cursore è all'inizio, quindi no problem, e leggi tutto il file fino alla fine.
Quando tu richiami fread una seconda volta, il cursore è alla fine del file, quindi la funzione non legge niente.
E' per questo che non visualizzi nulla.
Detta in maniera breve, nella funzione ricerca, prima dell'istruzione fread, inserisci questa linea di codice:
rewind(*g);
Questa funzione riporterà il cursore all'inizio del file
Per quanto riguarda il secondo errore, che visualizza tutte le informazioni, sei sicuro?
Hai messo un punto e virgola dopo l'istruzione while. In pratica il blocco if(mia_prenotazione>= 10...) è fuori il while e viene eseguito solo una volta.
Controlla e fammi sapere!
Ciao!
Hai dichiarato una variabile globale prenotazione mia_prenotazione, e poi ridichiari un'altra variabile con lo stesso nome sia nella funzione ricerca, che nella funzione visualizza. Ciò può creare problemi (e lo farà, fidati!

Per quanto riguarda il primo problema, che li visualizza solo una volta, quella è colpa del cursore
Ad ogni FILE è associato un valore chiamato cursore, che indica l'attuale posizione (o meglio il byte) all'interno del file.
Quando apri un file, il cursore è all'inizio del file.
fread prende come riferimento il cursore per iniziare a lavorare.
In pratica, tu leggi la prima volta, e il cursore è all'inizio, quindi no problem, e leggi tutto il file fino alla fine.
Quando tu richiami fread una seconda volta, il cursore è alla fine del file, quindi la funzione non legge niente.
E' per questo che non visualizzi nulla.
Detta in maniera breve, nella funzione ricerca, prima dell'istruzione fread, inserisci questa linea di codice:
rewind(*g);
Questa funzione riporterà il cursore all'inizio del file

Per quanto riguarda il secondo errore, che visualizza tutte le informazioni, sei sicuro?
Hai messo un punto e virgola dopo l'istruzione while. In pratica il blocco if(mia_prenotazione>= 10...) è fuori il while e viene eseguito solo una volta.
Controlla e fammi sapere!
Ciao!
ok grazie tante per l'aiuto ,
per la ricerca delle prenotazioni del primo anno funziona,mentre per l'ultimo punto avvero la stampa a video delle aule prenotate dalle 10 alle 13 mi stampa tutto quello che ho inserito nel file:
void visualizza(FILE **g)
{
FILE *fp;
fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
rewind(*g);
while (fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g))
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
//fclose(fp);
}

per la ricerca delle prenotazioni del primo anno funziona,mentre per l'ultimo punto avvero la stampa a video delle aule prenotate dalle 10 alle 13 mi stampa tutto quello che ho inserito nel file:
void visualizza(FILE **g)
{
FILE *fp;
fp=fopen("C:\\file.txt","ab");
prenotazione mia_prenotazione;
rewind(*g);
while (fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g))
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
//fclose(fp);
}
Di per sè la funzione mi sembra corretta, quindi ti suggerisco di controllare che i dati siano stati memorizzati e letti nella maniera corretta.
Modifica momentaneamente questa funzione in modo che stampi tutto il file, e controlla che non ci siano corruzioni.
E fai attenzione: sempre in questa funzione apri un altro stream allo stesso file. Crei problemi di accesso!
Modifica momentaneamente questa funzione in modo che stampi tutto il file, e controlla che non ci siano corruzioni.
E fai attenzione: sempre in questa funzione apri un altro stream allo stesso file. Crei problemi di accesso!
ok ho risolto ho seguito i tuoi consigli,ti chiedo un ultimo aiuto per un appello vecchio che non riesco a risolvere:
le richieste sono:
*individuare tra le offerte registrate quella con più alta quantità disponibile di iphone(modello) e stampare a video il fornitore corrispondente.
*stampare a video tutte le informazioni relative ai prodotti di una determinata marca fornita da tastiera.
ho cominciato a compilare ma sinceramente stò avendo non pochi problemi..
grazie ancora per l'aiuto..
****************************************
#include
#include
#include
typedef struct prodotto
{
int Codice;
char Marca[20];
char Modello[20];
char Descrizione[30];
float Prezzo;
}prodotto;
prodotto mio_prodotto;
void inserimento(FILE **);
void ricerca(FILE **);
void ordina(FILE **);
int contatore=0;
int main(int argv,char *argc[])
{
int operazione;
FILE *fp;
fp=fopen("C:\\iphood.txt","r+b");
if(!fp)
{
fp=fopen("C:\\iphood.txt","wb+");
if(!fp)
{
printf("impossibile aprire il file\n");
return 0;
}}
do {
printf("\nMENU: ");
printf("\n_______________________________");
printf("\n1. INSERIMENTO");
printf("\n2. STAMPA FORNITORE IN OFFERTA");
printf("\n3. STAMPA INFO MARCA TELEFONINO");
printf("\n4. Esci\n");
scanf("%d",&operazione);
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
ordina(&fp);
break;
}
}while (operazione!=4);
return 0;
}
void inserimento(FILE **g)
{
FILE *fp;
fp=fopen("C:\\iphood.txt","ab");
prodotto mio_prodotto;
printf("\nInserire marca: ");
scanf("%s",&mio_prodotto.Marca);
printf("\nInserire il Modello: ");
scanf("%s",&mio_prodotto.Modello);
printf("\nInserire descrizione: ");
scanf("%s",&mio_prodotto.Descrizione);
printf("\nInserire codice: ");
scanf("%d",&mio_prodotto.Codice);
printf("\nInserire prezzo: ");
scanf("%f",&mio_prodotto.Prezzo);
fwrite(&mio_prodotto,sizeof(prodotto),1, *g);
contatore=contatore+1;
fclose(fp);
}
void ricerca(FILE **g);
{
prodotto mio_prodotto;
FILE *fp;
fp=fopen("C:\\iphood.txt","ab");
rewind(*g);
while(fread(&mio_prodotto,sizeof(prodotto),1,*g)==1)
if((strcmp (mio_prodotto.Modello,"iphone")==0)
{
printf("\t%s",mio_prodotto.Prezzo);
printf("\t%s",mio_prodotto.Descrizione);
printf("\t%s",mio_prodotto.Modello);
printf("\t%d",mio_prodotto.Codice);
}
fclose(fp);
}
void ordina(FILE **g);
{
}
le richieste sono:

*individuare tra le offerte registrate quella con più alta quantità disponibile di iphone(modello) e stampare a video il fornitore corrispondente.
*stampare a video tutte le informazioni relative ai prodotti di una determinata marca fornita da tastiera.
ho cominciato a compilare ma sinceramente stò avendo non pochi problemi..
grazie ancora per l'aiuto..
****************************************
#include
#include
#include
typedef struct prodotto
{
int Codice;
char Marca[20];
char Modello[20];
char Descrizione[30];
float Prezzo;
}prodotto;
prodotto mio_prodotto;
void inserimento(FILE **);
void ricerca(FILE **);
void ordina(FILE **);
int contatore=0;
int main(int argv,char *argc[])
{
int operazione;
FILE *fp;
fp=fopen("C:\\iphood.txt","r+b");
if(!fp)
{
fp=fopen("C:\\iphood.txt","wb+");
if(!fp)
{
printf("impossibile aprire il file\n");
return 0;
}}
do {
printf("\nMENU: ");
printf("\n_______________________________");
printf("\n1. INSERIMENTO");
printf("\n2. STAMPA FORNITORE IN OFFERTA");
printf("\n3. STAMPA INFO MARCA TELEFONINO");
printf("\n4. Esci\n");
scanf("%d",&operazione);
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
ordina(&fp);
break;
}
}while (operazione!=4);
return 0;
}
void inserimento(FILE **g)
{
FILE *fp;
fp=fopen("C:\\iphood.txt","ab");
prodotto mio_prodotto;
printf("\nInserire marca: ");
scanf("%s",&mio_prodotto.Marca);
printf("\nInserire il Modello: ");
scanf("%s",&mio_prodotto.Modello);
printf("\nInserire descrizione: ");
scanf("%s",&mio_prodotto.Descrizione);
printf("\nInserire codice: ");
scanf("%d",&mio_prodotto.Codice);
printf("\nInserire prezzo: ");
scanf("%f",&mio_prodotto.Prezzo);
fwrite(&mio_prodotto,sizeof(prodotto),1, *g);
contatore=contatore+1;
fclose(fp);
}
void ricerca(FILE **g);
{
prodotto mio_prodotto;
FILE *fp;
fp=fopen("C:\\iphood.txt","ab");
rewind(*g);
while(fread(&mio_prodotto,sizeof(prodotto),1,*g)==1)
if((strcmp (mio_prodotto.Modello,"iphone")==0)
{
printf("\t%s",mio_prodotto.Prezzo);
printf("\t%s",mio_prodotto.Descrizione);
printf("\t%s",mio_prodotto.Modello);
printf("\t%d",mio_prodotto.Codice);
}
fclose(fp);
}
void ordina(FILE **g);
{
}
Visto che ancora non hai scritto tutto il codice, non te lo posso correggere.
Inoltre, sarebbe di aiuto avere il testo completo dell'esercizio, per sapere cosa richiede con esattezza.
Di contro, ti consiglio di rivedere un pò la struct che usi per memorizzare i dati: il primo esercizio parla di fornitore e di quantità disponibile per ogni fornitore, ma non vedo campi corrispondenti in "prodotto".
Puoi prendere in considerazione l'idea di fare più struct, e associarle in qualche modo (siamo nel campo dei Database in questo caso, ma ad un livello molto base!)
Inoltre, per le marche, ti conviene usare un ID numerico, visto che l'inserimento modello è fatto dall'utente (che non fa caso al minuscolo e maiuscolo), e la funzione strcmp è keysensitive (cioè fa distinzione fra minuscolo e maiuscolo).
Ci sono altri modi, ma a te il piacere di idearli!
Ciao!
Inoltre, sarebbe di aiuto avere il testo completo dell'esercizio, per sapere cosa richiede con esattezza.
Di contro, ti consiglio di rivedere un pò la struct che usi per memorizzare i dati: il primo esercizio parla di fornitore e di quantità disponibile per ogni fornitore, ma non vedo campi corrispondenti in "prodotto".
Puoi prendere in considerazione l'idea di fare più struct, e associarle in qualche modo (siamo nel campo dei Database in questo caso, ma ad un livello molto base!)
Inoltre, per le marche, ti conviene usare un ID numerico, visto che l'inserimento modello è fatto dall'utente (che non fa caso al minuscolo e maiuscolo), e la funzione strcmp è keysensitive (cioè fa distinzione fra minuscolo e maiuscolo).
Ci sono altri modi, ma a te il piacere di idearli!
Ciao!
ok grazie seguirò i tui consigli
a presto
a presto

ciao ho provato a risolvere il programma così,ho dei problemi nella visualizzazione dei numeri interi delle quantità ,mi escono dei numeri strani ...
#include
#include
#include
#include
#include "telefono.h"
FILE *fp;
typedef struct
{
char modello[20];
char marca[20];
int numpezzi;
char rivenditore[15];
int prezzo;
}offerta;
offerta mia_offerta;
int main()
{
char operazione;
do
{
printf("\n *****************************");
printf("\n MENU\n ");
printf("\n 1:INSERIMENTO CARATTERISTICHE TELEFONINO\n");
printf("\n 2:RICERCA TELEFONINO OFFERTA\n");
printf("\n 3:INFO MARCA TELEFONINO\n");
printf("\n 4:ELENCO ARTICOLI\n");
printf("\n 5:ESC\n");
printf("\n *****************************\n");
scanf("%c",&operazione);
switch(operazione)
{
case '1':inserisci();
break;
case '2':quantita_offerta();
break;
case '3':info_prodotti();
break;
case '4':stampa_elenco();
break;
}
}
while (operazione!='5');
}
void inserisci()
{
FILE *fp;
fp=fopen("File.txt","a");
if(fp==NULL)
{
printf("Impossibile aprire il file\n");
exit(1);
}
else
{
printf("\n inserimento modello telefonino\n");
scanf("%s",mia_offerta.modello);
printf("\n inserimento marca telefonino\n");
scanf("%s",mia_offerta.marca);
printf("\n inserimento quantita\n");
scanf("%d",&mia_offerta.numpezzi);
printf("\n inserimento rivenditore\n");
scanf("%s",mia_offerta.rivenditore);
printf("\n inserimento prezzo\n");
scanf("%d",&mia_offerta.prezzo);
fflush(stdin);
fwrite(&mia_offerta,sizeof(offerta),1,fp); //inserimento nuovo record in coda al file//
fclose(fp);
}
}
void quantita_offerta()
{
int conta=0;
FILE *fp;
fp=fopen("File.txt","r");
{
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
if (strcmp(mia_offerta.modello,"iphone")==0 && mia_offerta.numpezzi>conta)
conta=mia_offerta.numpezzi;
printf("\n QUANTITA IPHONE:\n");
printf("\t\t\t%d ",&mia_offerta.numpezzi);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s ",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%d ",&mia_offerta.prezzo);
}
fclose(fp);
}
//***********************************//
//cerca informazioni marca telefonino//
//***********************************//
void info_prodotti()
{
char marca[15];
int numero=0;
printf("\n inserisci marca telefonino:\n");
scanf("%s",marca);
FILE *fp;
fp=fopen("File.txt","r");
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
{
if (strcmp(mia_offerta.marca,marca)==0)
numero++;
}
printf("\n MODELLO:\n");
printf("\t\t\t%s ",mia_offerta.modello);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%d",&mia_offerta.prezzo);
fclose(fp);
}
void stampa_elenco()
{
FILE *fp;
fp=fopen("File.txt","r");
printf("\n ************************\n");
printf("\n ELENCO ARTICOLI:\n");
printf("modello\t\t marca\t\tprezzo\n\n");
printf("\n ************************\n");
while(fread(&mia_offerta,sizeof(offerta),1,fp)==0);
{
printf("%s %s %d",mia_offerta.modello,mia_offerta.marca,&mia_offerta.prezzo);
}
fclose(fp);
}


#include
#include
#include
#include
#include "telefono.h"
FILE *fp;
typedef struct
{
char modello[20];
char marca[20];
int numpezzi;
char rivenditore[15];
int prezzo;
}offerta;
offerta mia_offerta;
int main()
{
char operazione;
do
{
printf("\n *****************************");
printf("\n MENU\n ");
printf("\n 1:INSERIMENTO CARATTERISTICHE TELEFONINO\n");
printf("\n 2:RICERCA TELEFONINO OFFERTA\n");
printf("\n 3:INFO MARCA TELEFONINO\n");
printf("\n 4:ELENCO ARTICOLI\n");
printf("\n 5:ESC\n");
printf("\n *****************************\n");
scanf("%c",&operazione);
switch(operazione)
{
case '1':inserisci();
break;
case '2':quantita_offerta();
break;
case '3':info_prodotti();
break;
case '4':stampa_elenco();
break;
}
}
while (operazione!='5');
}
void inserisci()
{
FILE *fp;
fp=fopen("File.txt","a");
if(fp==NULL)
{
printf("Impossibile aprire il file\n");
exit(1);
}
else
{
printf("\n inserimento modello telefonino\n");
scanf("%s",mia_offerta.modello);
printf("\n inserimento marca telefonino\n");
scanf("%s",mia_offerta.marca);
printf("\n inserimento quantita\n");
scanf("%d",&mia_offerta.numpezzi);
printf("\n inserimento rivenditore\n");
scanf("%s",mia_offerta.rivenditore);
printf("\n inserimento prezzo\n");
scanf("%d",&mia_offerta.prezzo);
fflush(stdin);
fwrite(&mia_offerta,sizeof(offerta),1,fp); //inserimento nuovo record in coda al file//
fclose(fp);
}
}
void quantita_offerta()
{
int conta=0;
FILE *fp;
fp=fopen("File.txt","r");
{
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
if (strcmp(mia_offerta.modello,"iphone")==0 && mia_offerta.numpezzi>conta)
conta=mia_offerta.numpezzi;
printf("\n QUANTITA IPHONE:\n");
printf("\t\t\t%d ",&mia_offerta.numpezzi);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s ",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%d ",&mia_offerta.prezzo);
}
fclose(fp);
}
//***********************************//
//cerca informazioni marca telefonino//
//***********************************//
void info_prodotti()
{
char marca[15];
int numero=0;
printf("\n inserisci marca telefonino:\n");
scanf("%s",marca);
FILE *fp;
fp=fopen("File.txt","r");
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
{
if (strcmp(mia_offerta.marca,marca)==0)
numero++;
}
printf("\n MODELLO:\n");
printf("\t\t\t%s ",mia_offerta.modello);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%d",&mia_offerta.prezzo);
fclose(fp);
}
void stampa_elenco()
{
FILE *fp;
fp=fopen("File.txt","r");
printf("\n ************************\n");
printf("\n ELENCO ARTICOLI:\n");
printf("modello\t\t marca\t\tprezzo\n\n");
printf("\n ************************\n");
while(fread(&mia_offerta,sizeof(offerta),1,fp)==0);
{
printf("%s %s %d",mia_offerta.modello,mia_offerta.marca,&mia_offerta.prezzo);
}
fclose(fp);
}
Può dipendere da due cose:
1)Il carattere finitore \0 che negli array di char non è messo automaticamente, quindi devi metterlo tu alla fine della stringa, e comunque devi controllare che tutta la stringa, compreso il carattere finitore, non sia più lunga del size dell'array.
2)La modalità di lettura e scrittura del file.
Con la modalità che stai usando, lui considera tutto quello che scrive e che legge come char, quindi come un carattere.
Quando scrivi la struct nel file, gli interi li considera come un array di 4 char (int = 4 byte; char = 1byte).
Se vai a guardare la ASCII, il carattere "1" ha come valore 49.
Puoi provare due soluzioni:
1) come già ti avevo suggerito, apri in modalità binaria il file sia in scrittura che in lettura. (questa dovrebbe comportare minori modifiche al codice)
2) scrivi ogni campo della struct in una riga diversa, e per leggere usi il metodo fgets http://www.cplusplus.com/reference/clibrary/cstdio/fgets/, per scrivere il metodo fputs http://www.cplusplus.com/reference/clibrary/cstdio/fputs/
Dai un'occhiata al file che crei con notepad: ti può aiutare a capire cosa sta succedendo!
1)Il carattere finitore \0 che negli array di char non è messo automaticamente, quindi devi metterlo tu alla fine della stringa, e comunque devi controllare che tutta la stringa, compreso il carattere finitore, non sia più lunga del size dell'array.
2)La modalità di lettura e scrittura del file.
Con la modalità che stai usando, lui considera tutto quello che scrive e che legge come char, quindi come un carattere.
Quando scrivi la struct nel file, gli interi li considera come un array di 4 char (int = 4 byte; char = 1byte).
Se vai a guardare la ASCII, il carattere "1" ha come valore 49.
Puoi provare due soluzioni:
1) come già ti avevo suggerito, apri in modalità binaria il file sia in scrittura che in lettura. (questa dovrebbe comportare minori modifiche al codice)
2) scrivi ogni campo della struct in una riga diversa, e per leggere usi il metodo fgets http://www.cplusplus.com/reference/clibrary/cstdio/fgets/, per scrivere il metodo fputs http://www.cplusplus.com/reference/clibrary/cstdio/fputs/
Dai un'occhiata al file che crei con notepad: ti può aiutare a capire cosa sta succedendo!
ok .
grazie ti farò sapere ..
grazie ti farò sapere ..

ciao per quanto riguarda il punto 2 leggere e scrivere in modalità binaria:
void quantita_offerta()
{
int conta=0;
FILE *fp;
fp=fopen("File.txt","ab");
{
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)==1);
if (strcmp(mia_offerta.modello,"iphone")==0 && mia_offerta.numpezzi>=conta)
conta=mia_offerta.numpezzi;
printf("\n QUANTITA IPHONE:\n");
printf("\t\t\t%d",&mia_offerta.numpezzi);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s ",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f ",&mia_offerta.prezzo);
}
fclose(fp);
}
il ,mio outuput è:
quantità iphone:-->4288872 che dovrebbe essere 20 pezzi
rivenditore-->non esce nulla mentre in modalità "a" esce scritto
prezzo--> 0.000
mentre per quanto riguarda fgets e fputs non sò come si utilizzano ..
scusa tanto per il fastidio che ti stò dando purtroppo non avendo la possibilità di seguire il corso ,per lavoro è famiglia,cerco aiuto in questo forum..
void quantita_offerta()
{
int conta=0;
FILE *fp;
fp=fopen("File.txt","ab");
{
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)==1);
if (strcmp(mia_offerta.modello,"iphone")==0 && mia_offerta.numpezzi>=conta)
conta=mia_offerta.numpezzi;
printf("\n QUANTITA IPHONE:\n");
printf("\t\t\t%d",&mia_offerta.numpezzi);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s ",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f ",&mia_offerta.prezzo);
}
fclose(fp);
}
il ,mio outuput è:
quantità iphone:-->4288872 che dovrebbe essere 20 pezzi
rivenditore-->non esce nulla mentre in modalità "a" esce scritto
prezzo--> 0.000
mentre per quanto riguarda fgets e fputs non sò come si utilizzano ..
scusa tanto per il fastidio che ti stò dando purtroppo non avendo la possibilità di seguire il corso ,per lavoro è famiglia,cerco aiuto in questo forum..
no, figurati. Siamo sulla stessa barca 
Comunque, io non capisco perchè ci sia un punto e virgola subito dopo il comando while(fread(&mia_offerta,sizeof(offerta),1,fp)==1);
Non ha senso!! Il punto e virgola chiude un'istruzione vuota, mentre dovresti aprire una parentesi graffa e richiuderla dopo l'ultimo printf
In ogni modo, tornando al tuo problema, il file lo hai cancellato e riscritto ex novo, tutto in modalità binaria?

Comunque, io non capisco perchè ci sia un punto e virgola subito dopo il comando while(fread(&mia_offerta,sizeof(offerta),1,fp)==1);
Non ha senso!! Il punto e virgola chiude un'istruzione vuota, mentre dovresti aprire una parentesi graffa e richiuderla dopo l'ultimo printf
In ogni modo, tornando al tuo problema, il file lo hai cancellato e riscritto ex novo, tutto in modalità binaria?
si
se lo scrivo in modalità binaria non funziona lo stesso non so perchè
#include
#include
#include
#include
#include "telefono.h"
typedef struct offerta
{
char modello[20];
char marca[20];
int numpezzi;
char rivenditore[15];
float prezzo;
}offerta;
offerta mia_offerta;
struct mia_offerta;
void inserisci(FILE **);
void quantita_offerta(FILE **);
void info_prodotti(FILE **);
void stampa_elenco(FILE **);
int main(int argc, char *argv[])
{
char operazione;
FILE *fp;
fp=fopen("C:\\file.txt","r+b");
if (!fp)
{
// Se il file non esiste
fp=fopen("C:\\file.txt", "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("\n *****************************");
printf("\n MENU\n ");
printf("\n 1:INSERIMENTO CARATTERISTICHE TELEFONINO\n");
printf("\n 2:RICERCA TELEFONINO OFFERTA\n");
printf("\n 3:INFO MARCA TELEFONINO\n");
printf("\n 4:ELENCO ARTICOLI\n");
printf("\n 5:ESC\n");
printf("\n *****************************\n");
scanf("%c",&operazione);
switch(operazione)
{
case '1':inserisci();
break;
case '2':quantita_offerta();
break;
case '3':info_prodotti();
break;
case '4':stampa_elenco();
break;
}
}
while (operazione!='5');
}
void inserisci()
{
FILE *fp;
fp=fopen("File.txt","ab");
if(fp==NULL)
{
printf("Impossibile aprire il file\n");
exit(1);
}
else
{
printf("\n inserimento modello telefonino\n");
scanf("%s",mia_offerta.modello);
printf("\n inserimento marca telefonino\n");
scanf("%s",mia_offerta.marca);
printf("\n inserimento quantita\n");
scanf("%d",&mia_offerta.numpezzi);
printf("\n inserimento rivenditore\n");
scanf("%s",mia_offerta.rivenditore);
printf("\n inserimento prezzo\n");
scanf("%5.3f",&mia_offerta.prezzo);
fflush(stdin);
fwrite(&mia_offerta,sizeof(struct offerta),1,fp); //inserimento nuovo record in coda al file//
fclose(fp);
}
}
void quantita_offerta()
{
int conta=0;
FILE *fp;
fp=fopen("File.txt","r");
{
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)==0);
if (strcmp(mia_offerta.modello,"iphone")==0 && mia_offerta.numpezzi>conta)
conta=mia_offerta.numpezzi;
//fornitore=mia_offerta.numpezzi;
printf("\n QUANTITA IPHONE:\n");
printf("\t\t\t%d",&mia_offerta.numpezzi);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s ",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f ",&mia_offerta.prezzo);
}
fclose(fp);
}
//***********************************//
//cerca informazioni marca telefonino//
//***********************************//
void info_prodotti()
{
char marca[15];
int numero=0;
printf("\n inserisci marca telefonino:\n");
scanf("%s",marca);
FILE *fp;
fp=fopen("File.txt","r");
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
{
if (strcmp(mia_offerta.marca,marca)==0)
numero++;
}
printf("\n MODELLO:\n");
printf("\t\t\t%s ",mia_offerta.modello);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f",&mia_offerta.prezzo);
fclose(fp);
}
void stampa_elenco()
{
FILE *fp;
fp=fopen("File.txt","rb");
printf("\n ************************\n");
printf("\n ELENCO ARTICOLI:\n");
printf("modello\t\t marca\t\tprezzo\n\n");
printf("\n ************************\n");
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)==0);
{
printf("%s %s %5.3f",mia_offerta.modello,mia_offerta.marca,&mia_offerta.prezzo);
}
fclose(fp);
}
se lo scrivo in modalità binaria non funziona lo stesso non so perchè
#include
#include
#include
#include
#include "telefono.h"
typedef struct offerta
{
char modello[20];
char marca[20];
int numpezzi;
char rivenditore[15];
float prezzo;
}offerta;
offerta mia_offerta;
struct mia_offerta;
void inserisci(FILE **);
void quantita_offerta(FILE **);
void info_prodotti(FILE **);
void stampa_elenco(FILE **);
int main(int argc, char *argv[])
{
char operazione;
FILE *fp;
fp=fopen("C:\\file.txt","r+b");
if (!fp)
{
// Se il file non esiste
fp=fopen("C:\\file.txt", "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("\n *****************************");
printf("\n MENU\n ");
printf("\n 1:INSERIMENTO CARATTERISTICHE TELEFONINO\n");
printf("\n 2:RICERCA TELEFONINO OFFERTA\n");
printf("\n 3:INFO MARCA TELEFONINO\n");
printf("\n 4:ELENCO ARTICOLI\n");
printf("\n 5:ESC\n");
printf("\n *****************************\n");
scanf("%c",&operazione);
switch(operazione)
{
case '1':inserisci();
break;
case '2':quantita_offerta();
break;
case '3':info_prodotti();
break;
case '4':stampa_elenco();
break;
}
}
while (operazione!='5');
}
void inserisci()
{
FILE *fp;
fp=fopen("File.txt","ab");
if(fp==NULL)
{
printf("Impossibile aprire il file\n");
exit(1);
}
else
{
printf("\n inserimento modello telefonino\n");
scanf("%s",mia_offerta.modello);
printf("\n inserimento marca telefonino\n");
scanf("%s",mia_offerta.marca);
printf("\n inserimento quantita\n");
scanf("%d",&mia_offerta.numpezzi);
printf("\n inserimento rivenditore\n");
scanf("%s",mia_offerta.rivenditore);
printf("\n inserimento prezzo\n");
scanf("%5.3f",&mia_offerta.prezzo);
fflush(stdin);
fwrite(&mia_offerta,sizeof(struct offerta),1,fp); //inserimento nuovo record in coda al file//
fclose(fp);
}
}
void quantita_offerta()
{
int conta=0;
FILE *fp;
fp=fopen("File.txt","r");
{
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)==0);
if (strcmp(mia_offerta.modello,"iphone")==0 && mia_offerta.numpezzi>conta)
conta=mia_offerta.numpezzi;
//fornitore=mia_offerta.numpezzi;
printf("\n QUANTITA IPHONE:\n");
printf("\t\t\t%d",&mia_offerta.numpezzi);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s ",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f ",&mia_offerta.prezzo);
}
fclose(fp);
}
//***********************************//
//cerca informazioni marca telefonino//
//***********************************//
void info_prodotti()
{
char marca[15];
int numero=0;
printf("\n inserisci marca telefonino:\n");
scanf("%s",marca);
FILE *fp;
fp=fopen("File.txt","r");
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
{
if (strcmp(mia_offerta.marca,marca)==0)
numero++;
}
printf("\n MODELLO:\n");
printf("\t\t\t%s ",mia_offerta.modello);
printf("\n RIVENDITORE:\n");
printf("\t\t\t%s",mia_offerta.rivenditore);
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f",&mia_offerta.prezzo);
fclose(fp);
}
void stampa_elenco()
{
FILE *fp;
fp=fopen("File.txt","rb");
printf("\n ************************\n");
printf("\n ELENCO ARTICOLI:\n");
printf("modello\t\t marca\t\tprezzo\n\n");
printf("\n ************************\n");
fseek (fp, 0L, SEEK_SET);
while(fread(&mia_offerta,sizeof(offerta),1,fp)==0);
{
printf("%s %s %5.3f",mia_offerta.modello,mia_offerta.marca,&mia_offerta.prezzo);
}
fclose(fp);
}
ciao hai dato un'occhiata al programma?
diciamo che i numeri interi li visualizza solo nella modalità int,non in float.
poi sto impazzendo nel far cercare il telefonino in offerta ovvero a minor prezzo.
puoi aiutarmi?,spero di si
diciamo che i numeri interi li visualizza solo nella modalità int,non in float.
poi sto impazzendo nel far cercare il telefonino in offerta ovvero a minor prezzo.
puoi aiutarmi?,spero di si

Mettimi l'output!
nella ricerca offerta:
rivenditore tim
prezzo 15
marca lg
rivenditore tim
prezzo 15
marca lg
printf("\n PREZZO:\n");
printf("\t\t\t%5.3f ",&mia_offerta.prezzo);
Hai messo un simbolo in più... a te scoprire quale
while(fread(&mia_offerta,sizeof(offerta),1,fp)>0);
LO VUOI TOGLIERE QUESTO ; ALLA FINE DELLA ISTRUZIONE?!

Scusami, ma pensavo di avertelo già detto!
il modo giusto di scriverlo è senza ;
la sintassi è questa:
while(condizione)
{
istruzione/i;
}
Se tu continui a mantenere quel punto e virgola, il compilatore vedrà un istruzione vuota, che deve eseguire ogni ciclo while
se, invece, lo elimini, eseguirà tutto il codice che c'è fra le parentesi graffe ogni volta che ripete il ciclo.
Ed è quello che tu vuoi.
E rivedi le istruzioni all'interno del ciclo.
A quanto ho capito, vuoi stampare solo l'offerta più alta. Il codice che hai scritto non si comporta in quella maniera.
Infatti, prima di stampare, devi terminare tutto il ciclo while e aver fatto tutti i confronti.
Ciao!