Salve, ho un problema come da titolo. Praticamente si ha una struttura fatta di:
- char nome [30]
- int prezzo
Ciò che voglio fare io è inserire prima tutti i prodotti, e successivamente ordinarli alfabeticamente. Il mio programma, però, funziona solo a volte: ad esempio, non funziona con questa casuale combinazione nome-prezzo:
-Aouiop 9
-AAexd 5
-Aeofg 7
-Mopfr 5
-Bxd 3
-Bef 10
Vi posto il codice (la parte che dico io è la if(sc=='4'), le altre van bene). Secondo voi quale può essere il problema?
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <fstream>
#include <cstring>
using namespace std;
struct tab{
char nome[30];
int prezzo;
}lista,aplista;
int main()
{
char sc,sc2;
FILE *f;
cout<<"Scegli l'operazione da effettuare: \n";
cout<<"1.Riscrittura lista\n";
cout<<"2.Visualizzazione elenco\n";
cout<<"3.Estrazione di un n-esimo record \n";
cout<<"4.Ordinamento alfabetico\n";
sc=getch();
if(sc=='1'){//CREAZIONE E SCRITTURA
f=fopen("lista.dat","w");
do{
cout<<"\nInserisci il nome dell'elemento: ";
cin.getline(lista.nome,30);
cout<<"Inserisci il suo prezzo: ";
cin>>lista.prezzo;
fwrite(&lista,sizeof(tab),1,f);
cout<<"Vuoi inserire un altro prodotto? (s/n)\n";
sc2=getch();
fflush(stdin);
}while(sc2=='s');
fclose(f);
}
else if(sc=='2'&&fopen("lista.dat","r")){//SCANSIONE SEQUENZIALE
f=fopen("lista.dat","r");
fread(&lista,sizeof(tab),1,f);
cout<<endl;
while(!feof(f)){
cout<<lista.nome<<" "<<lista.prezzo<<endl;
fread(&lista,sizeof(tab),1,f);
}
fclose(f);
}
else if(sc=='3'&&fopen("lista.dat","r")){//ESTRAZIONE
int n;
f=fopen("lista.dat","r");
do{
cout<<endl<<"Inserire il numero del prodotto (il primo e' 0): ";
cin>>n;
fseek(f,sizeof(tab)*n,SEEK_SET);
if(fread(&lista,sizeof(tab),1,f)){
cout<<endl<<lista.nome<<" "<<lista.prezzo<<endl;
}
cout<<"\nVuoi cercare un altro prodotto? (s/n)\n";
sc2=getch();
fflush(stdin);
}while(sc2=='s');
fclose(f);
}
else if(sc=='4'&&fopen("lista.dat","r")){//ORDINAMENTO
f=fopen("lista.dat","r+");
int n=0,itemp;
int s;
char ctemp[30];
do{
s=0;
n=0;
fseek(f,sizeof(tab),SEEK_SET);
//Posizionamento sull'elemento immediatamente successivo e relativo controllo,
while(fread(&lista,sizeof(tab),1,f)){ //equivale al for(i=0;i<n-1;i++)
fseek(f,sizeof(tab)*n,SEEK_SET);
fread(&lista,sizeof(tab),1,f);
fseek(f,sizeof(tab)*(n+1),SEEK_SET);
fread(&aplista,sizeof(tab),1,f);
if(strcmp(lista.nome,aplista.nome)>0){ //Controllo alfabetico. E' maggiore di 0 se la prima stringa è più grande
strcpy(ctemp,lista.nome);
strcpy(lista.nome,aplista.nome);
strcpy(aplista.nome,ctemp);
itemp=lista.prezzo;
lista.prezzo=aplista.prezzo;
aplista.prezzo=itemp;
fseek(f,sizeof(tab)*n,SEEK_SET);
fwrite(&lista,sizeof(tab),1,f);
fseek(f,sizeof(tab)*(n+1),SEEK_SET);
fwrite(&aplista,sizeof(tab),1,f);
s=1;
}
n++;
fseek(f,sizeof(tab)*(n+1),SEEK_SET); //Funzione analoga a come visto sopra
}
}while(s==1);
fclose(f);
}
system("pause");
return 0;
}