|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
File in c++
Codice:
void lettura(rubrica indice)
{
FILE *fp;
fp=fopen("rubrica.txt","r");
if(fp!=NULL)
{
while(!feof(fp))
{
fread(&indice,sizeof(indice),1,fp);
cout <<"\nNome: " <<indice.nome;
cout <<"\nCognome: " <<indice.cognome;
cout <<"\nIndirizzo: " <<indice.indirizzo;
cout <<"\nNumero: " <<indice.numero;
}
}
else
cout <<"\nFile inesistente";
fclose(fp);
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Perchè non raggiungi l'EOF subito , ma al ciclo dopo .
in pratica tu nel file hai questi dati : Codice:
DATO1 DATO2 DATO3 DATO4 EOF DATO2 è il cognome e così via . tu dici a fread di leggere la struttura, che è composta da quei 4 dati , ma fread non raggiunge in realtà EOF , ma si ferma a DATO4 , che è l'ultimo elemento della struttura . Così al successivo controllo della struttura iterativa "while" il sistema si renderà conto che la fine del file non è ancora stata raggiunta, e continuerà il Ciclo . Ovviamente ormai non c'è + niente da leggere, ma nonostante questo riesegue tutte le operazioni da capo cercando di caricare la struttura di nuovo . Quello che ti consiglio di fare è di implementare un sistema per il controllo dei dati letti. FREAD dà come valore di ritorno il numero di elementi che è riuscita a leggere con successo . potresti memorizzare questo valore in una variabile , e controllarla con una "if" prima di mandare in output "Nome" "Cognome" ... Dato che la struttura è di dimensione fissata puoi fare in modo di controllare se il valore mandato in output da "fread" sia 0 . Se il valore mandato in output da fread è 0 significa che non è riuscita a leggere COMPLETAMENTE nessuna struttura dal file durante questa chiamata e quindi puoi sfruttare questo fatto per far saltare alla tua funzione la scrittura a schermo di tutte quelle cose che non servono . Magari quello che ho scritto può sembrare un po' oscuro , ma ti consiglio di dare bene un occhiata al prototipo di funzione di FREAD per informazioni chiarificatorie sul suo funzionamento . Se stai su un sistema UNIX "man fread" basta per avere informazioni sulla stessa . Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
infatti ho fatto così, grazie
|
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: File in c++
Quote:
Codice:
#include <fstream>
using namespace std;
void lettura(rubrica indice)
{
ifstream f("rubrica.txt" );
f.exceptions( ios_base::eofbit );
try {
while( true )
{
f.get( (char*)(&indice) ,sizeof(indice));
cout <<"\nNome: " <<indice.nome;
cout <<"\nCognome: " <<indice.cognome;
cout <<"\nIndirizzo: " <<indice.indirizzo;
cout <<"\nNumero: " <<indice.numero;
}
} catch( ios_base::failure )
{ /* fine del file */ }
/* etc */
}
1- codice non testato, non lamentarti se non compila :P 2- i dati sono memorizzati "in chiaro" nel file ? (visto l'estensione .txt direi di si') In tal caso non e' consigliato leggere i dati nel modo che fai tu. 3- passi "indice" per valore, forse volevi farlo per puntatore o per riferimento. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
Piccolo problema con un ordinamento:
Codice:
void ordina (rubrica indice,temporaneo temp,temporaneo2 temp2)
{
FILE *fp;
int n,controllo,controllo1,pos;
fp=fopen("rubrica.txt","r+t");
if(fp!=NULL)
{
while(!feof(fp))
{
controllo=fread(&indice,sizeof(indice),1,fp);
if(controllo>0)
{
controllo=fread(&temp,sizeof(temp),1,fp);
if(controllo>0)
{
if(strcmp(indice.nome,temp.nome)>0) //indice.nome > temp.nome
{
pos=ftell(fp)-(sizeof(indice)*2);
//Inizio Scambio
strcpy(temp2.nome,indice.nome);
strcpy(temp2.cognome,indice.cognome);
strcpy(temp2.indirizzo,indice.indirizzo);
strcpy(temp2.numero,indice.numero);
//Fine Scambio su temp 2
//Inizio Scambio temp con indice;
strcpy(indice.nome,temp.nome);
strcpy(indice.cognome,temp.cognome);
strcpy(indice.indirizzo,temp.indirizzo);
strcpy(indice.numero,temp.numero);
//Fine Scambio su Indice
//Inizio Scambio di Tem2 su temp
strcpy(temp.nome,temp2.nome);
strcpy(temp.cognome,temp2.cognome);
strcpy(temp.indirizzo,temp2.indirizzo);
strcpy(temp.numero,temp2.numero);
//Fine Scambio di Temp2 su Temp
//Salvo tutto su file
fseek(fp,pos,0);
if((controllo=fwrite(&indice,sizeof(indice),1,fp)) && (controllo1=fwrite(&temp,sizeof(temp),1,fp)) >0)
{
pos=ftell(fp)-sizeof(indice);
fseek(fp,pos,0);
printf("\nRubrica ordinata correttamente");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
}
else
{
fclose(fp);
printf("\nErrore nell'ordinamento della rubrica...");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
}
}
}
}
pos=ftell(fp)-sizeof(indice);
fseek(fp,pos,0);
}
}
fclose(fp);
}
Dove sbaglio?? |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
Devo caricare tutte le strutture che ho su file in un vettore, è giusto fare così ??
Codice:
void ordina (rubrica indice)
{
FILE *fp;
rubrica vettore[500];
int n,i;
fp=fopen("rubrica.txt","r+t");
if(fp!=NULL)
{
while(!feof(fp))
fread(vettore,sizeof(vettore),1,fp);
}
Ultima modifica di Gogeta ss4 : 23-09-2004 alle 20:36. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
nessuno??
Please e per domani... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:55.



















