Avatar billede walden Nybegynder
18. april 2009 - 14:51 Der er 11 kommentarer og
1 løsning

skrive og slette i en fil på samme tid

Er der nogen, der kan give et bud på, hvordan man skriver og sletter linier i en tekst-fil i én action.

Jeg skal skrive til en tekst-fil, der ikke må indeholde mere end 20 linier. Når en ny linie bliver til føjet i toppen, skal linie nummer 21 slettes i bunden.
Avatar billede olebole Juniormester
18. april 2009 - 15:06 #1
<ole>

Prøv at give os en chance for at komme med et forslag ved at fortælle lidt mere om, hvad du vil. Hvor kommer dine data f.eks. fra - og hvordan ankommer de til scriptet?

/mvh
</bole>
Avatar billede walden Nybegynder
18. april 2009 - 16:22 #2
Jeg skal skrive til tekst-filen ved at udfylde en formular, der har en php-fil som action og et enkelt input-felt.

Tekst-filen kommer til at bestå af en række produkter, der står på hver deres linie:

Sodavand<br>
Æbler<br>
Vinglas<br>

Når listen når op på 20 poster (linier) må tekstfilen fremover ikke rummer flere linier.

Dvs. at en ny post bliver tilføjet i toppen af listen, samtidig med at den nederste post (Vinglas fx.) bliver slettet. Ved næste nye post bliver linien med "Æbler" slettet og så fremdeles.
Avatar billede andreas13_fam Nybegynder
18. april 2009 - 16:43 #3
Uden at have forstået spørgsmålet helt tror jeg at denne kan gøre det:

$nylinje er så den nye linje der skal sættes ind.

<?php
$filindhold = file_get_contents("fil.txt");
$nylinje = "test\r\n";
$sum = $nylinje."".$filindhold;
$lines = explode("\r\n", $sum);
$ny = "";

for($i=0; $i<count($lines); $i++){
    if($i < 20){
    $ny .= $lines[$i]."\r\n";
    }
}

$ny = preg_replace("/^((.|\r\n)*)\r\n$/", "\\1", $ny);

$fil = fopen("fil.txt", "w");
fwrite($fil, $ny);
fclose($fil);
?>
Avatar billede walden Nybegynder
18. april 2009 - 17:22 #4
Tak Andreas for dit bud, men det virker bare ikke som jeg ønsker det. Ærgerligt at jeg ikke kan forklare det ordentligt. Jeg giver det dog lige et forsøg mere :-)

Forestil dig, at det drejer sig om en liste over seneste nyheder. Jeg er kun interesseret i at vise en liste med de 20 seneste nyheder.

Hver nyhed skrives som sagt til den samme tekst-fil via en formular. Når formularen submittes, tjekker php-scriptet hvor mange linier tekst-filen består af. Hvis der allerede er listet 20 nyheder, slettes den ældste nyhed og den aktuelle skrives ind i toppen af listen.

Hvis der er under 20 nyheder listet (på hver deres linie i text-filen) tilføjes den nye post naturligvis blot i toppen af listen.
Avatar billede andreas13_fam Nybegynder
18. april 2009 - 18:40 #5
Ikke for at fornærme nogen, men det er sådan set også det mit script gør (det er testet)

Grunden til at det ikke virker kan være på grund af \r\n

hvis jeg husker rigtigt så er det
\r\n = windows
\n = Linux (eller er det unix)
\n\n = Mac

Du køre nok Linux og så skal det nok være:
PS: jeg har tilføjet "kommentarer"
<?php
$filindhold = file_get_contents("fil.txt"); //henter indholdet af fil.txt
$nylinje = "test\n"; //her er den nye linje som skal indsættes
$sum = $nylinje."".$filindhold; //her sættes den nye linje sammen med resten af teksten
$lines = explode("\n", $sum); //her opdeles ved her linje i teksten i et arrya
$ny = ""; //starter på at skrive den nye fil

for($i=0; $i<count($lines); $i++){ //køre en løkke
    if($i < 20){ //hvis hvilen ikke er kørt mere end 20 gange
    $ny .= $lines[$i]."\n"; //skriver linjen til den nye fil
    }
}

$ny = preg_replace("/^((.|\n)*)\n$/", "\\1", $ny);//fjerne den sidste \n (kan sikkert gøres mere smart)

$fil = fopen("fil.txt", "w"); //starter datastrøm fra fil.txt
fwrite($fil, $ny); //skriver i filen
fclose($fil); //lukker datastrøm
?>
Avatar billede andreas13_fam Nybegynder
18. april 2009 - 18:44 #6
Du kunne jo også skrive hvad der går galt eller eventuelt udskrive
echo '<pre>';
print_r($lines);
echo '</pre>';

echo $ny;
Avatar billede walden Nybegynder
18. april 2009 - 18:58 #7
Jeg bliver skam ikke fornærmet over at blive gjort opmærksom på at jeg ikke har forstået scriptet korrekt :-)

Jeg prøver at teste endnu en gang og vender så tilbage med svar på om jeg kan få det til at virke ... tak for hjælpen så langt :-)
Avatar billede walden Nybegynder
18. april 2009 - 19:21 #8
Jeg kører med windows.

Her er min index.php

<?php
include("fil.txt");
?>

<form method="post" action="lines.php" name="formline">
<input type="text" name="nylinje" id="nylinje">
<input type="image" src="media_24/grafik/knap_send.gif">
</form>
?>

Her er lines.php

<?php
$filindhold = file_get_contents("fil.txt"); //henter indholdet af fil.txt
//$nylinje = "test\r\n"; //her er den nye linje som skal indsættes
$sum = $nylinje."".$filindhold; //her sættes den nye linje sammen med resten af teksten
$lines = explode("\r\n", $sum); //her opdeles ved her linje i teksten i et arrya
$ny = ""; //starter på at skrive den nye fil

for($i=0; $i<count($lines); $i++){ //køre en løkke
    if($i < 10){ //hvis hvilen ikke er kørt mere end 20 gange
    $ny .= $lines[$i]."\r\n"; //skriver linjen til den nye fil
    }
}

$ny = preg_replace("/^((.|\r\n)*)\r\n$/", "\\1", $ny);//fjerne den sidste \n (kan sikkert gøres mere smart)

$fil = fopen("fil.txt", "w"); //starter datastrøm fra fil.txt
fwrite($fil, $ny); //skriver i filen
fclose($fil); //lukker datastrøm


echo '<pre>';
print_r($lines);
echo '</pre>';

echo $ny;
?>

jeg har prøvet at submitte tallene 1 - 12.

I fil.txt står tallene sådan: 121110987654321

print_r($lines) udskriver dette:

Array
(
    [0] => 121110987654321
)

121110987654321

Scriptet sletter, som jeg kan se det, ikke de ældste poster.
Avatar billede walden Nybegynder
18. april 2009 - 19:33 #9
Andreas

Jeg har ændret linien:
$nylinje = "test\r\n";

til

$nylinje = $nylinje."\r\n";

Før det havde jeg simpelthen udkommenteret linien.

Det virker perfekt. Tusind tak for hjælpen. Skriver du et svar?
Avatar billede andreas13_fam Nybegynder
18. april 2009 - 20:39 #10
husk at bruge $_POST['nylinje'] når du henter data fra post. Det er noget mere kompatibelt. Har jeg lært af de rigtige eksperter :D

$nylinje = $_POST['nylinje']."\r\n";

PS: Jeg er kun glad for at enlig kunne konkurrer med eksperterne ;)
Avatar billede walden Nybegynder
18. april 2009 - 21:02 #11
Jeg er glad, du er glad ... alt er fint :-)
Avatar billede olebole Juniormester
19. april 2009 - 00:00 #12
<ole>

I stedet for løkken kunne man kikke på array_slice:
    http://dk.php.net/manual/en/function.array-slice.php

$newArr = array_slice($arr, 0, 20); // $newArr indeholder de 20 første elementer i $arr

/mvh
</bole>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Cognizant Technology Solutions Denmark ApS

Azure Architect

Metroselskabet og Hovedstadens Letbane

Applikationsansvarlig medarbejder med udvikler-kompetencer

NOVAX A/S

Sales Executive