Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Miten voi kirjoittaa tiedoston alkuun?

Sivun loppuun

Antti88 [26.06.2004 15:52:01]

#

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ä :)...

Blaze [26.06.2004 16:11:01]

#

Luet talteen tiedoston sisällön, avaat sen kirjoitusta verten tuolla w-optionilla, kirjoitat uuden datan ja vanhan datan sen perään.

T.M. [26.06.2004 16:34:35]

#

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.

Antti88 [26.06.2004 18:03:45]

#

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...

Jyri [26.06.2004 18:07:12]

#

No nurin perin käskyllä 'array_reverse' kysy jos tarviit enempi käyttöohjetta :)

sooda [26.06.2004 18:14:05]

#

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.

Antti88 [26.06.2004 20:28:10]

#

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...

T.M. [26.06.2004 20:34:36]

#

Katoppa piruuttasi mitä tuo $nurinperin muuttuja sisältää kun sitä yritetään laittaa fopen() funktiolle...

Jyri [26.06.2004 22:11:43]

#

Sille sivulle jolla se tiedosto halutaan näyttää. Ainkin mun mielestä, ja se ainaki mun viekussa toimii :>

tsuriga [26.06.2004 23:14:01]

#

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ä?

NiKC [28.06.2004 16:58:14]

#

Ehkä yksi hyvä teko parantais tämän hirvittävän olotilan... :P

$data = file("tiedo.sto");

for ($i = count($data); $i > 0; $i--)
{
   print($data[$i]);
}

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);
}

pistemies [05.07.2004 17:44:14]

#

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

tsuriga [05.07.2004 18:36:02]

#

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 :)

pistemies [05.07.2004 20:11:05]

#

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ä

tsuriga [05.07.2004 21:23:39]

#

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 :)

pistemies [05.07.2004 21:53:26]

#

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... :)

tsuriga [05.07.2004 22:09:33]

#

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..

pistemies [05.07.2004 22:19:34]

#

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....

tsuriga [05.07.2004 22:23:14]

#

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.

pistemies [05.07.2004 22:29:29]

#

hyvä, luulin jo, että testasit tuota tuon array()-rivin kanssa...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta