2013-10-08 13 views
5

Ho un programma in cui ho bisogno di scrivere righe di testo in un file di log molto frequentemente. Vorrei limitare il numero di righe nel file di registro a 1000. Quando scrivo le righe al file, dovrebbe aggiungerle normalmente. Una volta che il file raggiunge 1000 righe, mi piacerebbe sbarazzarmi della prima riga e quindi aggiungere quella nuova. Qualcuno sa se c'è un modo per farlo senza riscrivere l'intero file ogni volta?Algoritmo per scrivere un numero limitato di righe nel file di testo

+1

Operatore contatore e MOD? – Pol0nium

+0

È davvero necessario svuotare ogni riga o scrivere su un buffer temporaneo? – jrok

+2

È possibile trasformare il file in un buffer circolare, purché si assegni una dimensione fissa per ogni riga. Fai in modo che la prima riga sia l'indice di scrittura corrente, quindi, fai in modo che tutte le altre righe abbiano una certa larghezza. Quando raggiungi il numero massimo desiderato, torna all'indice 0. –

risposta

0

Ogni volta che si desidera accedere, è possibile aprire il file, leggere l'indice di scrittura, passare alla posizione e scrivere la voce del registro a larghezza fissa. Quando l'indice raggiunge la soglia superiore, è sufficiente impostarlo su 0.

Ci sono molti avvisi con questo, sebbene - primo è che ogni voce di registro corretta (supponendo che si chiuda il file in mezzo) richiederà un open, una lettura, una ricerca, una scrittura, una ricerca, una scrittura e chiudi - per trovare il tuo indice, andare su di esso, scrivere la nuova voce, quindi aggiornare il tuo indice. Hai anche i problemi inerenti alla scrittura di un elemento di dati a dimensione fissa. Inoltre, un lettore umano dipenderà dal contenuto per sapere dove si trova "l'inizio" del file. La maggior parte delle persone si aspetta che la "linea 1" sia la prima linea.

Sono un sostenitore molto più grande di avere semplicemente alcuni file e "ruotarli", in modo che ogni file sia coerente, ma se si desidera un solo file con un numero fisso di righe, il buffer circolare l'idea può funzionare

+0

@ user2848097 Penso che tu abbia un'idea migliore di come rendere questo efficiente di quanto ho postato, ma se ti ha aiutato, sono contento. –

+0

Sto mantenendo ciascuna riga di testo in un buffer circolare. Tengo traccia dell'ultimo indice e lo utilizzo per determinare quale ordine scriverli nel file. È sorprendentemente efficiente, anche con 1000 linee. Grazie! –

1

In genere è un po 'meglio per un caso come questo per rimuovere più di una riga alla volta dall'inizio.

Cioè, se il limite è di 1000 righe e si toccano 1000 righe, eliminare i primi 300 circa, quindi riprendere la scrittura. In questo modo, non eseguirai l'operazione di cancellazione con ogni singola riga scritta successivamente, solo ogni 300 volte. Se è necessario mantenere 1000 righe, tenere invece fino a 1300 e cancellare 300 quando 1300 viene raggiunto.

1

Tutti i file devono essere allineati alle dimensioni del cluster FS. Quindi no, non c'è modo. È possibile aggiungere una riga a un file, ma non è possibile eliminare la prima riga senza riscrivere i file. È possibile utilizzare 2 file a turno. Oppure utilizzare qualche buffer in memoria e lavarlo periodicamente.

1

Penso che sia ancora necessario eseguire la scansione del file per scoprire quante righe ci sono nel file in questo momento. In tal caso, puoi inserirlo in una sorta di buffer da cui potresti facilmente aggiungere ed eliminare. Quindi si esegue la registrazione e una volta terminato, è possibile "riscrivere" il file con il buffer (o solo le ultime 1000 righe). Altre alternative sono discusse sopra. E sì, cerca di evitare di eliminare riga per riga. Generalmente, è un'operazione costosa.

Ho trovato alcuni argomenti simili qui e su CodeProject:

Small logger class;

Flexible logger class using standard streams in C++

http://www.codeproject.com/Articles/584794/Simple-logger-for-Cplusplus

Spero che troverete utili :)

0

Quando si desidera utilizzare solo un file, e la lunghezza delle linee non sono costanti, non c'è modo senza dover riscrivere l'intero file.

A seconda della frequenza con cui si aggiunge al file, non vedo alcun problema a farlo. 1000 linee di circa 100 caratteri sono solo circa 100kb, il che non è molto. Inoltre è possibile aggiungere qualche isteresi.

Tuttavia:

  • Se la lunghezza della linea è costante (o hard-limite la lunghezza della linea ad una costante), si può solo sovrascrivere la linea più antica. Ma poi devi tenere traccia delle posizioni dei file di registro delle vecchie/nuove linee
  • Vorrei utilizzare due file: il primo in cui aggiungi le righe. Quando il file si riempie, rinominalo in un secondo e riempia il primo dall'inizio.