Miten voin aloittaa kirjoittamisen tiedoston alusta siten, että myös vanhat tiedot säilyisivät?
Kun avaa tiedoston "w"-tilassa niin silloin se pyyhkii kaiken pois.
Kun taas avaan tiedoston "a"-tilassa niin kirjoittaminen alkaa tiedoston lopusta...
Mutta haluaisin että voisi kirjoittaa tiedoston alkuun...
Auttakaa tyhmää php amatööriä :)...
Luet talteen tiedoston sisällön, avaat sen kirjoitusta verten tuolla w-optionilla, kirjoitat uuden datan ja vanhan datan sen perään.
lainaus:
Mutta haluaisin että voisi kirjoittaa tiedoston alkuun...
Auttakaa tyhmää php amatööriä :)...
Tiedoston alkuun ei ole _mitään_ tarvetta kirjoittaa.
Tiedon voit lukea yhtä hyvin nurinperinkin.
No kertokaas sitten miten sen tiedoston voi lukea nurinperin?
Ja Blaze: Yritin tuollaista itsekin väkertää, mutta ei taidot riitänyt :( ...
Vois myös varmaan kattella uudestaan noi oppaat läpi...
No nurin perin käskyllä 'array_reverse' kysy jos tarviit enempi käyttöohjetta :)
Hanki filu vaikka file("filu.dat"); ja sitten muutat siitä sen rivin mikä pitää ja tunget sitte koko roskan takaisin. Php.net vois jelppiä myös.
Nyt olen aivan pihalla...
Esim. jos mulla on kaksi tekstikenttää(joihin kirjoitan vaikka "rivi1" ja "rivi2"), ja niiden mukaan kirjoitetaan tiedostoon "a"-tilassa, niin pitääkö mun laittaa tuo array_reverse-funktio formin "käsittelyscriptiin" vaiko sivulle, mille tiedosto halutaan näyttää...
Jos haluan tiedoston näkyviin sivulle, niin olen tottunut käyttämään "include-funktiota".
Eli pitäisikö minun käyttää:
<?php
$tiedosto = file("teksti.txt");
$tiedosto = array_reverse($tiedosto);
include($tiedosto);
?>
vaiko käsittelyscriptiin:
<?php
$nurinperin = file("teksti.txt");
$nurinperin = array_reverse($nurinperin);
$tiedosto = fopen("$nurinperin", "a");
fwrite($tiedosto, "Rivi1");
fwrite($tiedosto, "Rivi2");
fclose($tiedosto);
?>
Joo eli siinä oli mun jutut...
Katoppa piruuttasi mitä tuo $nurinperin muuttuja sisältää kun sitä yritetään laittaa fopen() funktiolle...
Sille sivulle jolla se tiedosto halutaan näyttää. Ainkin mun mielestä, ja se ainaki mun viekussa toimii :>
array_reverse kääntää taulukon arvot ylösalaisin. Mieti loogisesti. Uusi entry (data) kirjoitetaan tiedostoon viimeiseksi append (a) tilassa. Näyttösivulla tiedosto luetaan taulukkoon, jolloin uusin entry on viimeisenä. Eli mitä teet jos tahdot nähdä uusimman entryn ensimmäisenä?
Ehkä yksi hyvä teko parantais tämän hirvittävän olotilan... :P
edit: Jaaniin, tämä siis tiedostoa lukevalle sivulle jollei se tuosta jo selvinny. Kirjoitukset tiedoston loppuun.
tai
$data = file("tiedo.sto"); foreach (array_reverse($data) as $rivi) { print($rivi); }
offtopic
lainaus:
Jos jostakin syystä tartvitsee kirjoittaa tiedoston alkuun, sen voi tehdä helpomminkin:
<?php $teksti=file("testi.txt"); $taulu = array($teksti); array_unshift($taulu[0], "UUSI RIVI ALKUUN "); $imp=implode("\n",$taulu[0]); $fp=fopen("testi.txt","w"); fwrite($fp,$imp); fclose($fp); // Näytetään uusi tulos tiedostosta $uusi_file=file("testi.txt"); $uusi_arr=array($uusi_file); echo "<pre>"; print_r ($uusi_arr); echo "</pre>"; ?>Edit: Kunhan väkersin tämän
filellä lukiessa ne rivinvaihdot säilyvät siellä rivin perässä eli implodea "":lla jos tuota käyttää. Ja $taulu[0] paikalle samaisessa funktiossa sekä array_unshiftissä kuuluu $taulu. Ja $teksti-muuttujassa on jo se array, jolloin $taulu:a ei oikeastaan tarvitsekaan. Kuten myös $uusi_filessä, file palauttaa jo taulukon eikä niitä tartte castaa taulukoiks.
Vaihtoehtoisesti voisi tehdä:
<?php $filu=array_reverse(@file("testi.txt")); $filu[]="uusirivi<newline>"; $filu=implode("",array_reverse($filu)); $tt=@fopen("testi.txt","w"); @fwrite($tt,$filu); @fclose($tt); ?>
<newline>:n paikalle tietty haluamasi newline, \r\n, \r tai \n. Hiukan meni aikaa testatessa suoritusnopeuksia, mutta tiedoston ollessa yli 200 riviä tuo omani alkoi olla hitaampi. Sitä ennen se oli nopeampi. Johtuu tietenkin taulukon kääntelystä.
Eihä tuo ollu ees offtopiccia :)
tsuriga kirjoitti:
filellä lukiessa ne rivinvaihdot säilyvät siellä rivin perässä eli implodea "":lla jos tuota käyttää. Ja $taulu[0] paikalle samaisessa funktiossa sekä array_unshiftissä kuuluu $taulu.
Eihä tuo ollu ees offtopiccia :)
Sorry, kyllä tuossa tulee olla $taulu[0], sillä PHP-tekee tiedostosta seuraavanlaisen arrayn:
Array ( [0] => Array ( [0] => UUSI RIVI ALKUUN [1] => Eka rivi [2] => Toka rivi [3] => Tämä on jo kolmas rivi [4] => Selkis ) )
Mitä tulee offtopiciin, käsitin että homma saadaan jo hoitumaan array_reverseä käyttämällä
Mitähän PHP:n versiota käytät kun noin palauttaa?
Itsellä palauttaa kyllä ihan riveittäin (Win98, php 4.3.5 tai 4.3.7). Muokkasin koodisi tällaiseksi:
<?php $taulu=implode("",array_unshift(@file("testi2.txt"),"uusirivi\r\n")); $fp=fopen("testi2.txt","w"); fwrite($fp,$taulu); fclose($fp); ?>
..ja hyvin toimii.
Ps. this.topic()=="Miten voi kirjoittaa tiedoston alkuun?"
EDIT: Lähemmäs one-lineria :)
Kyllä se palauttaa sinullakin samalla tavalla.
Muutos johtuu siitä, että sinulta puuttuu välistä tämä rivi:
$taulu = array($teksti);
Mutta ihan hyvä. Sitä ei siinä tarvita... :)
Kyllä tuo minun on hitaampi vaikka rivejä olisi yksi. Eikä ihmekään kun taulukkoa käännellään ympäri ämpäri. Printtasin filen tuloksen:
Array ( [0] => Uusi rivi: 49 [1] => Uusi rivi: 48..
Voiko tosiaan olla, että PHP:n versioissa on tuollaisia eroja? Tuollainen eroavuushan sotkee PHP:n toiminnan.
Minulla on se, mikä int2000 palvelimella sattuu olemaan, sillä olen tehnyt testit netissä. Toisella koneellani, jossa on palvelin, ei ole nettiyhteyttä. En viitsi hyppiä koneen ääreltä toiselle....
Se johtuu siitä sinun arrayn luonnista tiedostosta, testailin tällä.
<?php print_r(array(@file("testi.txt"))) ?>
Eli file palauttaa taulukon, jonka indeksit ovat tiedoston rivinumeroita ja array($filu) tekee sen, että $filu (joka on taulukko) laitetaan uuden taulukon indeksiin nolla.
EDIT: Castaus lienee väärä sana tähän.
hyvä, luulin jo, että testasit tuota tuon array()-rivin kanssa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.