Skocz do zawartości

Fopen/fwrite zapis do pierwszej linii pliku tekstowego


Ecnelis

Rekomendowane odpowiedzi

Witam. Jest sobie takie coś:

<?php
$plik = 'load.txt';
$otworz = fopen($plik, "r+");
$tresc = "Zapis numer 4<br />\n";
$dopisz = fwrite($otworz, $tresc);
fclose($otworz);
?>

Chcę, aby zapisywało nowy tekst do pierwszej linii pliku, ale ekeft jest taki, że nadpisuje to co, już jest (jeśli nowy wpis ma mniej znaków niż stary do zostawia końcówkę starego). Przy fopen z parametrem "a" wszystko działa jak należy - nowe dopiski pojawiają się w nowej linii pod poprzednimi. Z "r+" dzieje się tak jak powyżej, a chyba nie powinno? A może jest inny sposób na dopisywanie do pliku tekstowego nowej treści na samym początku, a nie końcu?

Odnośnik do komentarza
Udostępnij na innych stronach

Tymi funkcjami nie zapiszesz nic na początku pliku (bez zamazywania - rewind na poczatek bedzie zamazywal) bo one nie potrafia przesunac zawartosci pliku. Musisz napisac swoje funkcje, ktore przepisza cala zawartosc.

PS. Tak jak wyzej jest w C,C++, w php byc moze jest inaczej ale bardzo nie sadze bo to sa pradopodobnie zaimplementowane funkcje C'owe.

PS2.Nie wiem czo chcesz osiagnac ale byc moze najprosciej i najefektywniej bedzie zapisywac jednak na koncu (tak jak Bozia dala) a wyswietlac od konca.

Odnośnik do komentarza
Udostępnij na innych stronach

A nie prościej dokleić pierwszą linię do odczytanej wcześniej zawartości pliku i zapisać całości ponownie?

<?php
$plik = 'load.txt';
$staraTresc = file_get_contents($plik);
$otworz = fopen($plik, "w"); //w umieszcza wskaźnik pliku na jego początku i obcina plik do zerowej długości
$tresc = "Zapis numer 4<br />\n".$staraTresc;
$dopisz = fwrite($otworz, $tresc);
fclose($otworz);
?>

"bytka abo ne bytka to je zapytka" - W. Shakespeare ;)

Niekończąca się impreza ;) ... wątroba zaleczona :D

Odnośnik do komentarza
Udostępnij na innych stronach

A nie prościej dokleić pierwszą linię do odczytanej wcześniej zawartości pliku i zapisać jej ponownie

O to mi chodziło pisząc o napisaniu własnej funkcji. To rozwiazanie przy dużych plikach będzie bardzo nieefektywne, nie mówiąc o niepotrzebnym zużyciu dysku. Lepiej zapisywać na końcu i odpowiednio odczytywać. Chyba, że pliki są małe i zmieniane raz na tydzień :D to nie ma potrzeby żeby sobie głowę zawracać efektywnymi rozwiązaniami.

Odnośnik do komentarza
Udostępnij na innych stronach

Plik nie wiadomo jakiej wielkości będzie, ale będzie się z nim dużo działo w krótkim czasie, ponieważ ma zawierać tekst aktualizowany na żywo przez jakieś 30-60 minut albo i dłużej. Może być więc spory, jeśli będzie dużo dopisywane. Efektywność jest więc jak najbardziej mile widziana.

Skoro z atrybutem "r+" nie przejdzie ostatecznie pozostałem przy otwieraniu pliku tylko do zapisu z kursorem na końcu. Potem po prostu pętla for odczytuje jego zawartośc od tyłu.

Dziękuję wszystkim za pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Potem po prostu pętla for odczytuje jego zawartośc od tyłu.

Chyba nie masz na myśli użycia funkcji file i wczytanie całego pliku do pamięci jako tablicy? W ogóle jeżeli plik będzie duży nie zmieści Ci się w ten sposób do pamięci. W takiej sytuacji radzę użyć bazy danych, będzie to najwydajniesze. Chyba, że musi to koniecznie działać na plikach.

Jeżeli masz założoną jakąś maksymalną długość linii radzę użyć takiego algorytmu (nie mam teraz czasu na napisanie tego):

- funkcją fseek do ustawić się na końcu pliku

- zapisać do zmiennej pozycja wartość funkcji ftell - (minus) liczba_wierszy_ktore_chesz_odczytac * max_dlugosc wiersza

- ustawić się fseekiem na tej pozycji

- wszytać plik do końca

- usunąć białe znaki z końca stringu

- w pętli używając strrpos odszukiwać znaki końca linii i funkcją substring wycinać kolejne linie.

Wydajniej się chyba nie da.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba nie masz na myśli użycia funkcji file i wczytanie całego pliku do pamięci jako tablicy?

Mniej więcej (odczyt pliku, przeliczenie linii i wyświetlenie linni $linia[0], $linia[1] itd). Użycie bazy niestety odpada.

W ogóle jeżeli plik będzie duży nie zmieści Ci się w ten sposób do pamięci.

Jak "duży"? Jest jakaś górna granica?

Odnośnik do komentarza
Udostępnij na innych stronach

Jak "duży"? Jest jakaś górna granica?

To zależy od ustawień serwera - wartość memory_limit w php.ini

"bytka abo ne bytka to je zapytka" - W. Shakespeare ;)

Niekończąca się impreza ;) ... wątroba zaleczona :D

Odnośnik do komentarza
Udostępnij na innych stronach

będzie się z nim dużo działo w krótkim czasie, ponieważ ma zawierać tekst aktualizowany na żywo przez jakieś 30-60 minut albo i dłużej

W takim przypadku nie mozna rownież zapomniec o blokowaniu takiego pliku na czas przetwarzania danych zwłaszcza gdy bedzie zapisywany zawsze w całości.

.

Odnośnik do komentarza
Udostępnij na innych stronach

Blokowanie dodane. :)

20 kb spokojnie możesz obrabiać na każdy (prawie ;) ) sposób nie martwiąc sie o zasoby ;)

Skoro z takim nie byłoby problemów to przy jakiej orientacyjnie wielkości mogłyby pojawić się problemy z wydajnością (jeśli w ogóle można to określić)? 50kB? 100 kB?

Odnośnik do komentarza
Udostępnij na innych stronach

fopen()

PHP 4.3.2 Dodano opcje 'x' i 'x+'
'x' Tworzy i otwiera plik tylko do zapisu; umieszcza wskaźnik pliku na jego początku. Jeśli plik juz istnieje, wywołanie fopen() nie powiedzie się, zwróci FALSE i wygeneruje błąd na poziomie E_WARNING. Jeśli plik nie istnieje, spróbuje go utworzyć. To jest równoważne z określeniem flag O_EXCL|O_CREAT stosowanym w wywołaniu systemowym open(2).
Wnioski ?

$tresc = "Zapis numer 4<br />\n";
$file = "baza.txt"; 
$fp = fopen($file, "x"); 
flock($fp, 2); 
fwrite($fp, $tresc); 
flock($fp, 3); 
fclose($fp);

:) Pozdrawiam ;)

logo-stat4seo-blue-small.png

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności