2013-10-08 13 views
5

Mam program, w którym bardzo często muszę zapisywać wiersze tekstu do pliku dziennika. Chciałbym ograniczyć liczbę linii w pliku dziennika do 1000. Kiedy piszę linie do pliku, powinien on dołączyć je normalnie. Gdy plik osiągnie 1000 linii, chciałbym pozbyć się pierwszej linii, a następnie dołączyć nową. Czy ktoś wie, czy istnieje sposób, aby to zrobić bez przepisywania całego pliku za każdym razem?Algorytm zapisu ograniczonej liczby linii do pliku tekstowego

+1

Licznik i operator MOD? – Pol0nium

+0

Czy w rzeczywistości konieczne jest opróżnienie każdej linii lub czy można zapisać do bufora tymczasowego? – jrok

+2

Można przekształcić plik w okrągły bufor, o ile przydzielony zostanie stały rozmiar dla każdej linii. Ustaw pierwszą linię jako bieżący indeks zapisu, a następnie ustaw pozostałe linie na określoną szerokość. Kiedy osiągniesz pożądane maksimum, po prostu wróć do indeksu 0. –

Odpowiedz

0

Za każdym razem, gdy chcesz się zalogować, możesz otworzyć plik, odczytać indeks zapisu, przeskoczyć do pozycji i wpisać wpis dziennika o stałej szerokości. Kiedy indeks osiągnie górny próg, po prostu ustaw go ponownie na 0.

Istnieje jednak wiele ostrzeżeń - po pierwsze, każdy prawidłowy wpis w dzienniku (zakładając, że zamkniesz plik pomiędzy) będzie wymagał otwarcia, przeczytania, poszukiwania, napisania, poszukiwania, napisania i zamknij - aby znaleźć swój indeks, przejdź do niego, napisz nowy wpis, a następnie zaktualizuj swój indeks. Masz również nieodłączne problemy z pisaniem elementu danych o stałym rozmiarze. Ponadto, ludzki czytelnik będzie zależał od twoich treści, aby wiedzieć, gdzie jest "początek" pliku. Większość ludzi oczekuje, że "linia 1" będzie pierwszą linią.

Jestem znacznie większym zwolennikiem po prostu posiadania kilku plików i "zwijania" ich, tak aby każdy plik sam był spójny, ale jeśli chcesz tylko jeden plik z ustaloną liczbą linii, okrągły bufor pomysł może zadziałać.

+0

@ user2848097 Myślę, że masz lepszy pomysł, jak sprawić, by było to wydajniejsze niż ja, ale jeśli ci pomogło, cieszę się. –

+0

Zatrzymuję każdy wiersz tekstu w okrągłym buforze. Śledzę ostatni indeks i używam go, aby określić kolejność zapisywania ich w pliku. Jest zaskakująco wydajny, nawet z 1000 linii. Dzięki! –

1

Ogólnie rzecz biorąc, w przypadku takiego przypadku lepiej jest usunąć więcej niż jedną linię naraz.

Oznacza to, że jeśli twój limit wynosi 1000 linii, a ty trafisz 1000 linii, usuń pierwszych 300 lub więcej, a następnie wznów pisanie. W ten sposób nie wykonujesz operacji usuwania z każdą kolejną linią napisaną później, tylko co 300 razy. Jeśli potrzebujesz utrzymywać 1000 linii, zamiast tego zachowaj do 1300 i usuń 300 po osiągnięciu 1300.

1

Wszystkie pliki należy wyrównać do rozmiaru klastra FS. Tak, nie, nie ma mowy. Możesz dołączyć linię do pliku, ale nie możesz usunąć pierwszej linii bez przepisywania pliku. Możesz użyć 2 plików po kolei. Lub użyj bufora w pamięci i okresowo go przepłucz.

1

Myślę, że nadal trzeba zeskanować plik, aby dowiedzieć się, ile wierszy znajduje się w pliku w tym momencie. W takim przypadku możesz umieścić go w jakimś buforze, który możesz łatwo dodać i usunąć. Następnie wykonuje się rejestrowanie, a po zakończeniu można "ponownie zapisać" plik z buforem (lub tylko z ostatnich 1000 linii). Inne alternatywy są omówione powyżej. I tak, staraj się unikać usuwania linii po linii. Zasadniczo jest to kosztowna operacja.

Znalazłem kilka podobnych tematów tutaj i na CodeProject:

Small logger class;

Flexible logger class using standard streams in C++

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

Mam nadzieję, że przydadzą :)

0

Gdy chcesz korzystać tylko jeden plik, a długość linii nie są stałe, nie ma sposobu, bez przepisywania cały plik.

W zależności od tego, jak często dodajesz plik, nie widzę problemu. 1000 linii ok. 100 znaków to tylko ok. 100kb, co nie jest dużo. Dodatkowo możesz dodać trochę histerezy.

Jednakże:

  • Jeśli długość przewodu jest stała (lub trudno ograniczyć długość linii do pewnej stałej), można po prostu zastąpić najstarszą linię. Ale musisz śledzić pozycje plików dziennika starych/nowych linii
  • Używałbym dwóch plików: Pierwszy, w którym dodajesz linie. Gdy plik się zapełni, zmień jego nazwę na drugą i wypełnij pierwszą od początku.
Powiązane problemy