PDA

View Full Version : end of file


termozeta
12-08-2005, 10:21
ciao a tutti,
ho un problema con la lettura di un file... in pratica vorrei poter capire se nel file ci sono numeri o meno(in pratica file vuoto).Ho provato ad usare la funzione eof()(che è una fz booleana che restituisce 1 se si è arrivati a fine file e false altrimenti) ma ,se metto un numero nel file, dopo averlo letto eof=1 e va bene ma se lascio il file vuoto mi da' sempre eof=0.Potreste darmi qualche idea per rilevare un file di soli spazi? grazie a tutti

kapo04
12-08-2005, 10:28
Non so, potresti provare ad usare fread(), che rende il numero di dati effettivamente letti, se sono 0 vuol dire che il file è vuoto... :)

Fenomeno85
12-08-2005, 10:36
penso che lavori sotto c ... quindi la soluzione migliore è quella:


if (!feof()){
//there are data
}


se invece vuoi estarre dati finché il file non è finito allora una soluzione stupida è:


while (!feof()){
//read data
}



~§~ Sempre E Solo Lei ~§~

Ed_Bunker
12-08-2005, 10:40
ciao a tutti,
ho un problema con la lettura di un file... in pratica vorrei poter capire se nel file ci sono numeri o meno(in pratica file vuoto).Ho provato ad usare la funzione eof()(che è una fz booleana che restituisce 1 se si è arrivati a fine file e false altrimenti) ma ,se metto un numero nel file, dopo averlo letto eof=1 e va bene ma se lascio il file vuoto mi da' sempre eof=0.Potreste darmi qualche idea per rilevare un file di soli spazi? grazie a tutti
Penso che gli spazi siano dei caratteri come lo sono un 'a' o una 'b'.
A priori non puoi sapere quali siano i caratteri che si trovano nel file pertanto devi controllarli esplicitamente.
Un controllo per evitare di andare a fare la eof() su un file vuoto e' quella di controllare il field della struttura stat che ne indica la dimensione. Se tale dimensione e' 0 allora eviti di scandire il file.

kapo04
12-08-2005, 10:41
Anche fread() si usa in C... :stordita: Io dicevo di usarla cosi:

if (fread(ecc ecc..)==0) //se è vera il file è vuoto..

Dico cosi perchè ho sempre avuto dei problemi con la funzione feof()... :cry:

Fenomeno85
12-08-2005, 10:53
Anche fread() si usa in C... :stordita: Io dicevo di usarla cosi:

if (fread(ecc ecc..)==0) //se è vera il file è vuoto..

Dico cosi perchè ho sempre avuto dei problemi con la funzione feof()... :cry:

si anche se lo scopo non è quello di controllare se un file è finito ma di leggere una struttura o altro :)


~§~ Sempre E Solo Lei ~§~

termozeta
12-08-2005, 12:26
scusate non ho specificato che sto lavorando sotto c++ e la read vorrei evitarla perche' ha il problema di dover decodificare i numeri da codice ascii(ossia mi restituisce i numeri in codice ascii e ,poi, legge pure gli spazi invece io voglio leggere solo i numeri).Allora uso ifstream che ignora automaticamente gli spazi e poi sfrutto l'overload dell'operatore >>.Solo che ho questo problema non so proprio come rilevare un file vuoto.Interessante anche la soluzione della dimensione solo che non so come implementarla.Potreste darmi qualche consiglio?

Fenomeno85
12-08-2005, 12:32
leggi carattere per carattere ... ed elimini lo spazio quando lo becchi

~§~ Sempre E Solo Lei ~§~

termozeta
12-08-2005, 13:11
grazie per il consiglio,solo che non so creare una procedura che ,semplicemente rilevi un file vuoto.Sapresti aiutarmi?

Fenomeno85
12-08-2005, 13:18
grazie per il consiglio,solo che non so creare una procedura che ,semplicemente rilevi un file vuoto.Sapresti aiutarmi?

in che senso file vuoto ... mica era spazio? ... cmq per lo spazio quando leggi ti basta guardare o in codice asci (dovrebbe se non ricordo male essere il 32) ... oppure semplicemente controlli che con ' ' :)

comunque posta il codice di quando leggi carattere per carattere

~§~ Sempre E Solo Lei ~§~

termozeta
12-08-2005, 14:22
ok il codice in se è molto semplice:
ifstream in("path");
if(!in.is_open())
cout<<"it's impossible to open the file"<<endl;
else
{
int *d,size;
d=new int[size];
for(int i=0;i<size;i++)
in>>d[i];
}
se ci sono numeri nel file tipo
1 2 3
4 5 6
7 8 9

verranno copiati in d[i] ma questa procedura devo fare in modo che parta SOLO se nel file ci sono numeri.se il file resta vuoto(pagina bianca) vorrei rilevarlo in modo da evitare che la procedura di sopra vada in esecuzione

Fenomeno85
12-08-2005, 14:56
scusa ma te dichiari size e poi lo usi come valore per finire il ciclo :mbe: perchè questo? anche il fatto di dichiarare un array di size.

size può valore qualsiasi valore potresti allocare quantità immense per nulla ... la cosa migliore è usare le liste e non utilizzare quella funzione che fa schifo senza offesa ;)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
12-08-2005, 15:02
ti scrivo un pezzo di procedura base poi te la modifichi come vuoi

~§~ Sempre E Solo Lei ~§~

kapo04
12-08-2005, 15:05
Scusa non potresti provare cosi:

int flag=0;
while(fread(&d[i],sizeof(int),1,file_pointer)){
//copi tutti i numeri
flag=1;
}
if(!flag) //il file era vuoto

Sono sicuro che c'è un metodo migliore per farlo, questo è solo uno spunto ma ti assicuro che in quanto a stile il mio esempio fa davvero pena...

Cmq anche io ti consiglio di usare le liste ;)

termozeta
12-08-2005, 15:23
avete ragione messa cosi' sembra assurdo...vi spiego meglio:
io dapprima genero dei numeri random e li metto in un file (quindi a priori conosco la lunghezza perche' i numeri li ho generati io),poi uso questi numeri in un'altra classe.Questa classe nel suo costruttore mette questi numeri in una matrice,pero',se nel file non metto numeri(pagina bianca)la matrice resta inizializzata a tutti zeri.Cmq è vero in generale è meglio la lista.Per caso sapete dove posso prelevare il codice per crearne una?grazie ancora

kapo04
12-08-2005, 15:31
Ecco una base per costruire una lista:

typdef struct nodo* nodo_pointer;
typedef struct nodo{
int key;
nodo_pointer next;
}nodo;

nodo_pointer add_nodo(nodo_pointer a,int k){
nodo_pointer x,app=a;
x=(nodo_pointer)malloc(nodo));
if(!(x)){
printf("\nMemoria esaurita");
exit(0);
}
x->key=k;
x->next=NULL;
if(!app)
a=x;
else{
while(app->next)
app=app->next;
app->next=x;
}
return a;
}

Prendilo giusto come esempio, ma in qualsiasi manuale di C/C++ sono ben spiegate ;)

Fenomeno85
12-08-2005, 15:32
#include <stdio.h>
#include <windows.h>
#include <conio.h>

struct nodo{
int iValue;
nodo *pNext;
};


int main (){
nodo *head, *el;
FILE *fp;
int i, var;
char num[5];
char file[] = "file.txt";
head = NULL;

if ((fp = fopen (file, "r")) == NULL){
perror ("\nError file");
return (-1);
}
else{
i = -1;
while (!feof (fp)){
var = fgetc (fp);
if (var == 32 || feof(fp) && i!=-1){
// insert new value in the list
el = new nodo;
el->iValue = atoi (num);
el->pNext = head;
head = el;
i = -1;
}
else{
i++;
num[i] = var;
num[i+1] = 0;
}

}
}
// see all element of the list
el = head;
while (el!=NULL){
printf ("\n%d", el-> iValue);
el = el-> pNext;
}
system ("PAUSE");
return (1);
}


se hai problemi chiedi

~§~ Sempre E Solo Lei ~§~

kapo04
12-08-2005, 15:33
Scusa ma non riesco a capire perchè non sia indentato.... :cry:

Fenomeno85
12-08-2005, 15:34
Scusa non potresti provare cosi:

int flag=0;
while(fread(&d[i],sizeof(int),1,file_pointer)){
//copi tutti i numeri
flag=1;
}
if(!flag) //il file era vuoto

Sono sicuro che c'è un metodo migliore per farlo, questo è solo uno spunto ma ti assicuro che in quanto a stile il mio esempio fa davvero pena...

Cmq anche io ti consiglio di usare le liste ;)

si hai solo il problema che dopo ti tocca estrarre i numeri e convertirli ... io invece prelevo becco lo spazio converto e ho la lista tutta bella già fatta :D

~§~ Sempre E Solo Lei ~§~

Fenomeno85
12-08-2005, 15:35
Scusa ma non riesco a capire perchè non sia indentato.... :cry:

code devi usare ;)

ricordati che fread tira su un carattere ... nel file un numero se non è di una sola cifra sballi :)

~§~ Sempre E Solo Lei ~§~

kapo04
12-08-2005, 16:15
Grazie per il code :)
Cmq sei sicuro che fread() rende solo carateri?? Io l'ho sempre usata per leggere tutto, però magari in C la funzione è gestita diversamente rispetto al C++ (che non conosco)..
Boh non lo so ma grazie per il consiglio ;)

Fenomeno85
12-08-2005, 16:18
Grazie per il code :)
Cmq sei sicuro che fread() rende solo carateri?? Io l'ho sempre usata per leggere tutto, però magari in C la funzione è gestita diversamente rispetto al C++ (che non conosco)..
Boh non lo so ma grazie per il consiglio ;)

no non rende solo caratteri ... però avevo buttato giù con fread (&var, sizeof(int),1,fp); e mi leggeva il numero staccato :) non ho voglia di stare a vedere troppo probabilmente ho sbagliato qualcosa :)

~§~ Sempre E Solo Lei ~§~

kapo04
12-08-2005, 16:25
Ah ok :) comunque complimenti per l'avatar :D

Fenomeno85
12-08-2005, 16:36
Ah ok :) comunque complimenti per l'avatar :D

fatto io :D


~§~ Sempre E Solo Lei ~§~

termozeta
12-08-2005, 16:50
vi ringrazio per l'aiuto e complimenti per la preparazione!!!!!! :cincin:

Fenomeno85
12-08-2005, 18:40
vi ringrazio per l'aiuto e complimenti per la preparazione!!!!!! :cincin:

de nada :)


~§~ Sempre E Solo Lei ~§~