2012-02-03 8 views
7

In un progetto, devo leggere un file, e devo lavorare con il numero di caratteri in un file, e c'è un modo per ottenere il numero di caratteri senza leggerlo carattere per carattere (altrimenti dovrò leggere il file due volte, una volta solo per trovare il numero di caratteri al suo interno).Come trovare il numero di caratteri in un file senza attraversare il contenuto

È possibile?

+0

In puro standard C++, o anche le API specifiche del sistema operativo vanno bene? Ci sono funzioni non portabili (es. ['GetFileSizeEx()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957 (v = vs.85) .aspx)) per ottenere la dimensione dei file. –

+0

Vuoi dire come ottenere la dimensione del file? –

+0

Beh, sono i compiti e non sono autorizzato a utilizzare le API. Tutto quello che posso usare sono le funzioni iostream e fstream. Neanche archi. – SpeedBirdNine

risposta

8

Si può provare questo:

FILE *fp = ... /*open as usual*/; 
fseek(fp, 0L, SEEK_END); 
size_t fileSize = ftell(fp); 

Tuttavia, questo restituisce il numero di byte nel file, non il numero di caratteri . Non è la stessa a meno che la codifica sia nota per essere un byte per carattere (ad esempio ASCII).

avresti bisogno di "riavvolgere" il file di nuovo all'inizio dopo che hai imparato la dimensione:

fseek(fp, 0L, SEEK_SET); 
+0

Grazie mille per l'aiuto! – SpeedBirdNine

+0

UTF-8 è una codifica a lunghezza variabile. –

+1

@ AndréCaron Grazie per la correzione! – dasblinkenlight

1

Penso che si stia cercando una soluzione di memoria dinamica . Quello che hai effettivamente chiesto è "c'è un modo per ottenere il numero di caratteri in un file senza leggerlo?". La risposta (presupponendo un byte per carattere) è sì, è possibile utilizzare la chiamata stat per ottenere la dimensione del file e la dimensione del file in byte è il numero di caratteri. Con UTF-8 la risposta è no, ma mettiamola da parte per il momento dato che gli scienziati informatici appena istruiti di solito non si preoccupano dell'internazionalizzazione.

Penso che la ragione per cui vuoi sapere quanti caratteri ci siano è che puoi avere spazio sufficiente per conservarli tutti. Non è necessario sapere quanto è grande il file per archiviare il tutto.

Se si dispone di un std::vector<char>, può iniziare in grado di contenere dieci caratteri, quindi crescere fino a contenere venti, quindi diecimila ... E quando hai finito di leggere il file, li terrà tutti, anche se non hai mai saputo quanti sarebbero stati.

1

Fuori della parte superiore della mia testa è in modo da avere uno sguardo alla dimensione del file e dividere che da quanti byte è un singolo personaggio?

I problemi sorgono quando si tratta di uno spazio bianco e linee di fondo, ecc

11

Sì.

Cercare fino alla fine ottenere la posizione della fine che è la dimensione.

FILE* file = fopen("Plop"); 
fseek(file, 0, SEEK_END); 
size_t size = ftell(file);  // This is the size of the file. 
           // But note it is in bytes. 
           // Also note if you are reading it into memory this is 
           // is the value you want unless you plan to dynamically 
           // convert the character encoding as you read. 

fseek(file, 0, SEEK_SET);  // Move the position back to the start. 

In C++ il flusso di avere la stessa funzionalità:

std::ifstream file("Plop"); 
file.seekg(0, std::ios_base::end); 
size_t size = file.tellg(); 

file.seekg(0, std::ios_base::beg); 
+0

Grazie, sia il tuo che la risposta accettata sono stati ugualmente utili, ho scelto quello con più voti. Grazie mille per la risposta ancora una volta! – SpeedBirdNine

1

La semplice risposta è no. Più precisamente, dipende dal sistema: sotto Unix, è possibile (ad esempio usando stat); sotto Windows, non è possibile per un file di testo, ma se stai leggendo il file in binario, c'è una funzione GetFileSize che può essere utilizzata.

Anche se non è garantita, in tutte le implementazioni che conosco (per queste due piattaforme), di cercare la fine del file, quindi facendo un ftell, tornerà qualcosa che, una volta convertito in una sufficientemente grande integrale digitare, darà gli stessi risultati di sopra (con le stesse restrizioni ).

Infine: perché avete bisogno di queste informazioni? Se si tratta solo di allocare un buffer di dimensioni opportune , anche con un file di testo, GetFileSize (e tell dopo aver cercato fino alla fine) restituirà un valore leggermente superiore rispetto al numero di byte che è possibile leggere. Il tuo buffer sarà leggermente superiore a , ma generalmente non è un problema.