|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
[c] aiuto I/O file
questo è il listato:
Codice HTML:
FILE *pass
void database()
{ char selezione,ambulanza[20];
int n=0;
do
{
system("cls");
pass=fopen("ambulanze.dat","r");
if (pass==NULL) printf("Impossibile aprire il file\n\n");
else
{ do
{
fread(ambulanza,sizeof(ambulanza),1,pass);
printf("%s",ambulanza);
}while(!feof(pass));
fclose(pass);
}
printf("\nAggiungere nuove ambulanze? S/N");
scanf("%c",&selezione);
if (selezione=='s')
{
printf("Inserisci l'associazione di appartenenza: ");
scanf("%s",ambulanza);
printf("Confermi: %s? S/N",&ambulanza);
scanf("%s",&selezione);
if (selezione == 's')
{ for(n=0;n<20;n++) if (ambulanza[n]=='\0') ambulanza[n+1]='\n';
pass=fopen("ambulanze.dat","a");
if (pass==NULL) printf("impossibile aprire il file o file non presente\n\n");
else
{ fwrite(ambulanza,20,1,pass);
fclose(pass);
}
}
}
}while (selezione != 'n');
system("pause");
menu();
}
Grazie |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
Quote:
Non ho capito perché devi fare questo loop: for(n=0;n<20;n++) if (ambulanza[n]=='\0') ambulanza[n+1]='\n'; Giusto per chiarire: quello che c'è e che scrivi nel file non sono proprio solo "righe" di testo ma blocchi di 20 byte esatti. Se nell'array 'ambulanza' il testo che inserisci è più corto, dopo il nullo finale (messo da scanf) c'è sicuramente "spazzatura". Inoltre ti segnalo, se lo accetti, che dovresti curare un pochino di più lo stile di scrittura del sorgente e mi riferisco in particolare alla indentazione.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
Ok! attualmente il listato è il seguente:
Codice HTML:
void database()
{ char selezione,ambulanza[20];
do
{
system("cls");
pass=fopen("ambulanze.dat","r");
if (pass==NULL) printf("Impossibile aprire il file\n\n");
else
{ do
{
fread(ambulanza,20,1,pass);
printf("%s",ambulanza);
clear(pass);
}while(!feof(pass));
fclose(pass);
}
printf("\nAggiungere nuove ambulanze? S/N");
scanf("%c",&selezione);
if (selezione=='s')
{
printf("Inserisci l'associazione di appartenenza: ");
scanf("%s",ambulanza);
printf("Confermi: %s? S/N",&ambulanza);
scanf("%c",&selezione);
if (selezione == 's')
{ pass=fopen("ambulanze.dat","a");
if (pass==NULL) printf("impossibile aprire il file o file non presente\n\n");
else
{ fwrite(ambulanza,20,1,pass);
fclose(pass);
}
}
}
}while (selezione != 'n');
system("pause");
menu();
}
Grazie |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
Quote:
Non mi sembra che sia il tuo caso. Devi scrivere stringhe testuali di lunghezza anche diversa e la lettura che fai all'inizio è di tipo "sequenziale". Se è come ho appena detto poco fa, allora ti conviene gestire il file a "righe" di testo, come un normale file di testo che si scrive con Notepad e simili. Usa fgets() per leggere una riga (occhio ci sono alcune questioni da tenere presente, vedi la documentazione) e usa fprintf() per scrivere la riga sul file.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
Si infatti inizialmente avevo risolto in quel modo solo che poi in un'altra funzione ho bisogno che siano salvati tutti come record distinti.. e questo mi sta creando non pochi problemi..
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se devi lavorare su un reacord salva e leggi il record intero.
Mettiamo che la struct sia questa: Codice:
struct pippo
{
char s1[20];
char s2[30];
int a;
int b;
double y;
};
struct pippo pluto; /* al posto di questa riga pluto viene riempito con i dati */ /* scrivo nel file dopo averlo aperto ovviamente */ fwrite(&pluto, sizeof(struct pippo), 1, out); Per leggere: struct pippo pluto; /*apro il file e leggo*/ fread(&pluto, sizeof(struct pippo), 1, in); |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
ho fatto come dicevi te.. ovviamente al posto di in e out ho messo il puntatore del mio file..
Mi è apparso il seguente errore: Codice HTML:
[Linker error] undefined reference to `clear' ld returned 1 exit status C:\Documents and Settings\Alessio\Desktop\118_firenze_soccorso\Makefile.win [Build Error] [118_firenze_soccorso.exe] Error 1 |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
L'errore è altrove...hai messo da qualche parte l'istruzione clear che non è un istruzione valida.
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
il fatto è che questo clear non c'è..
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi sembra strano. Prova a fare un nuovo progetto.
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2795
|
Nel secondo listato che hai postato però un clear c'è. Dentro al secondo do-while, magari non l'hai notato...
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
si lo so ma era già stato levato..
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
ho scritto questo programmino per prova.. solo che non capisco perchè l'ultimo valore inserito nel file me lo scrive per 2 volte..
Codice HTML:
#include <stdio.h>
FILE *pf;
main()
{char pluto[20];
printf("Indirizzo: ");
scanf("%s",pluto);
pf=fopen("servizi.dat","a");
if (pf==NULL) printf("Impossibile aprire il file\n\n");
else
{
fwrite(&pluto,sizeof(pluto),1,pf);
fclose(pf);
}
pf=fopen("servizi.dat","r");
if (pf==NULL) printf("Impossibile aprire il file\n\n");
else
{
do
{
fread(&pluto,sizeof(pluto),1,pf);
printf("%s\n",pluto);
}while(!feof(pf));
}
system("pause");
}
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
feof rileva la fine del file dopo che una lettura fallisce, quindi devi farlo così:
Codice:
do
{
fread(&pluto,sizeof(pluto),1,pf);
if(!feof(pf)) printf("%s\n",pluto);
}while(!feof(pf));
Codice:
while(1)
{
fread(&pluto,sizeof(pluto),1,pf);
if(feof(pf))
{
break;
}
printf("%s\n",pluto);
}
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
ok grazie mille cionci e grazie anche a tutti gli altri siete dei grandi!!
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
In genere basta fare:
Codice:
while (fread (&pluto,sizeof(pluto),1,pf) == 1)
{
/* usa pluto */
}
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì, vero, si può controllare anche il valore di ritorno di fread che deve essere pari al terzo parametro
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
ho fatto il programmino di prova e funziona.. sapete dirmi perchè qua mi scrive ma continua a non leggermi i valori nel file?
Codice HTML:
void database()
{ char selezione,ambulanza[20];
do
{
system("cls");
pass=fopen("ambulanze.dat","r");
if (pass==NULL) printf("Impossibile aprire il file\n\n");
else
{
do
{
fread(&ambulanza,sizeof(ambulanza),1,pass);
if (!feof(pass)) printf("%s\n",&ambulanza);
}while(!feof(pass));
fclose(pass);
}
printf("\nAggiungere nuove ambulanze? S/N");
scanf("%s",&selezione);
if (selezione=='s')
{
printf("Inserisci l'associazione di appartenenza: ");
scanf("%s",ambulanza);
printf("Confermi: %s? S/N",ambulanza);
scanf("%s",&selezione);
if (selezione == 's')
{
pass=fopen("ambulanze.dat","a");
if (pass==NULL) printf("Impossibile aprire il file\n\n");
else
{
fwrite(&ambulanza,sizeof(ambulanza),1,pass);
fclose(pass);
}
}
}
}while (selezione != 'n');
system("pause");
menu();
}
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
Aggiungo ancora un'ultimissima cosa: se si usano fread/fwrite per leggere/scrivere, come è appunto tipico, dati binari, è bene aprire il file in modalità "binaria", usando "rb", "wb" ecc...
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 70
|
ma la lettura di file che contengono stringe non è binario giusto? cmq ci sono degli errori? perchè scrivere mi scrive bene.. è la lettura che non va..
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:32.




















