Newsgroup: it.comp.lang.c++
Titolo: dimensione di un file asociato a fstrem

Ciao ho 2 domande:
1) se apro un file usando ad esempio
ifstream pippo("pippo.txt");
l'unico modo che ho trovato per ottenerne la dimensione e':
#include <io.h>
long size = filelength(pippo.rdbuf()->fd());
esiste un altro modo?
2) Per scovare le varie possibilita' offerte dagli stream in genere vado a
guardarmi i .h
Esiste da qualche parte un tutorial su di essi?
Grazie
Roberto

 esiste un altro modo?
se ricordo bene puoi usare seekg() per portare il cursore del file alla
sua fine e dopo leggere la posizione con tellg().
Ma non ne sono sicurissimo, comunque la soluzione e' molto vicina.
__________________________________________________________
Daniele Baggio
ITC/irst, Istituto per la Ricerca Scientifica e Tecnologica     
Loc. Pante' di Povo  I-38050 Trento  ITALY            
Tel: (+39) 0461-314-596 
e-mail: 
bag...@irst.itc.it
__________________________________________________________

 
riposto del codice che avevo gia` postato tempo fa:
#include <iostream>
#include <fstream>
int main(int, char *[]) {
    int lunghezzaFile;
    fstream f("myfile",ios::nocreate|ios::in|ios::out);
    f.seekg(0L,ios::end);
    lunghezzaFile=f.tellg();
    std::cout << lunghezzaFile << std::endl;
}
 

]


Mah!.. 
Penso che tu ti riferisca al fatto che la coppia CR+LF possa essere
considerata in alcuni casi come un carattere unico ma secondo me il
programma dovrebbe funzionare anche cosi` com'e`.
Io uso Linux. Ho fatto alcuni test per verificare la tua 
affermazione ma a me sembra che restituisca sempre la dimensione
corretta. 
Non so se lo standard prevede qualcosa al riguardo.
Marco Guidi.
 

corretta. 
Linux (come Unix) usa un solo carattere come terminatore di linea
(mi pare LF). In effetti anche a me risulta che bisogna aprire il file in modalita`
binaria.
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------------------------

In effetti anche a me risulta che bisogna aprire il file in modalita` binaria.
Credo che su linux (e sugli unix) funzioni perche' non esiste il
concetto di file binario o di testo come invece accade su windows.
--
(o-  T | If Bill Gate$ had a nickel for every time window$ crashed...
//\  U | ... oh, wait, he does...
V_/_ X | email: r.salmaso (at) 
flashnet.it
 | pinguin (at)
linuxfan.com
VDK (C++ GUI lib) 
http://www.guest.net/homepages/mmotta/VDKHome
VDKBuilder (RAD Tool) 
http://www.guest.net/homepages/mmotta/vdkbuilder


Non credo che sia dovuto all'esistenza o non esistenza di un modo
binario o testo, ma piuttosto al fatto che se il sistema dovesse
analizzare il file per verificare se contiene dei CR+LF o solo degli LF
o solo dei CR (formato MacIntosh), non sarebbe piů utilizzabile.
Immaginate se all'apertura di un file di 1GB il sistema dovesse
leggerselo tutto per verificare l'esistenza di tali terminatori di linea
per poi adattare la lunghezza del file. E cosa capiterebbe se
chiedessimo al sistema di muoversi di 1000 caratteri in avanti o in
dietro ? Se dovesse tenere conto dei terminatori di linea sarebbe
impossibile muoversi, sarebbe necessario verificare ogni carattere del
file.
Il modo binario o testo ha senso unicamente per le procedure di
lettura/scrittura. Per loro č importante conoscere il formato del file
per sapere cosa fare dei terminatori, ma tutte le altre funzioni
funzionano supponendo il file binario.
ciao, Leo
-- 
NOSPAM: Change L.G With my 
firstname.name
 in the reply address !
    .--.     
   |o_o |    Linux Forever
   |:_/ |    
  //   \ \   
 (|     | )  
/'\_   _/`\  Leopoldo Ghielmetti, EPFL-DMA ROSE, SETI SwissTeam Member
\___)=(___/

funzionano supponendo il file binario.
Si', ho provato: le funzioni di seek e di read/write diretto trattano
il file come se fosse binario pure sotto windows, con la complicazione
che una getline(s), ti legge non strlen(s)+1 caratteri, ma +2
___
Sciasbat
