Gå til innhold

Lesing og skriving fra fil


Anbefalte innlegg

Skrevet (endret)

Jeg står helt fast med et kjempe-enkelt problem, men har sett meg blind på det og trenger en uthvilt hjerne for å komme videre.

 

Holder på å lage en prototype på en gjestebok til noen studenter jeg har. Gjesteboken består av et gjestebok-objekt og en masse Entry-objekter. Selve entry-data skal skrives til en fil og leses ut igjen.

 

Essensen i problemet mitt:

når jeg skriver til fil får jeg noen entryobjekter som kun består av delimiters, og antall innlegg i gjesteboka mi øker eksponensielt. Hvor er logikken min bristende?

 

Allgoritme for lesing fra fil:

if filen finnes

les innholdet inn i en array

del hver linje ved skilletegn(|)

Opprett nytt Entryobjekt vha innhold i enkeltlinje

legg entryobjekt til i gjestebokens entries-array

endif

public function readEntries(){
 if(file_exists($this->filename)){
 	if(!$filecontent = file($this->filename)){
   print "I/O Error, please try later. Unable to open file for reading";
   exit;
 	}
 	foreach($filecontent as $lines){
   $e = explode("|", $lines);
   $entry = new Entry($e[0], $e[1], $e[2], $e[3]);	
   $this->add($entry);    	
 	}  	
 }
}

 

Allgoritme for skriving:

Åpne filen for skriving

for hvert element i arrayet

skriv entrydata

lukk filen

public function writeEnties(){
 if(!$fp = fopen($this->filename, 'w')){
 	print "I/O Error, please try later. Unable to open file for writing";
 	exit;
 }
 
 	//print "<h1>".count($this->entries)."</h1>";
 	foreach($this->entries as $entry){
   fwrite($fp, $entry->writeEntry());
 	}
 	fclose($fp);  	
}

 

Kode for writeEntry fra Entry-objekter:

public function writeEntry(){  
 return "$this->name | $this->email | $this->url | $this->message\n";
}

Jeg tror jeg skal ha fått med det som er viktig for å avdekke feilen min.. men mangler noe blir jeg veldig glad hvis du sier fra

Endret av CruellaDeVille
Videoannonse
Annonse
Skrevet

Jeg tipper:

 

Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den.

 

Bedrer seg dersom du sjekker om $lines != '' før du kjører

$e = explode("|", $lines); ?

Skrevet
Jeg tipper:

 

Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den.

 

Bedrer seg dersom du sjekker om $lines != '' før du kjører

$e = explode("|", $lines); ?

6838121[/snapback]

Men hvis jeg skriver linjen slik:

"dette er linje 1\n" og skal lese denne inn igjen... hvordan tar jeg høyde for new line da? Jeg kan ikke si at $lines !="\n", siden $lines inneholder "dette er linje1\n" også

Skrevet

litt usikker på hva dette her går ut på, men i en ekstreemt enkel gjestebok jeg laget en gang, så brukte jeg delimiter mellom navn og dato og melding. og melding var resten ut linja liksom, så selv om det var delimiter i meldingen så gikk det greit. ny linje fiksa jeg med nl2br() funksjonen som konverterer \n og slikt til <br> :) ingen skuddsikker gjestebok, men den funka for det meste :p

Skrevet
litt usikker på hva dette her går ut på, men i en ekstreemt enkel gjestebok jeg laget en gang, så brukte jeg delimiter mellom navn og dato og melding. og melding var resten ut linja liksom, så selv om det var delimiter i meldingen så gikk det greit. ny linje fiksa jeg med nl2br() funksjonen som konverterer \n og slikt til <br> :) ingen skuddsikker gjestebok, men den funka for det meste :p

6838824[/snapback]

 

dET ER vel nesten det jeg gjør også, men jeg leser ikke bare inn innholdet i filen og skriver det ut til skjermen, jeg plukker ut de enkelte delene av linjen (den er forøvrig på formen

Siv Renate | [email protected] | http://somesite.no | Dette er meldinge min\n

)

og putter dette i et Entryobjekt.

sukk og dobbeltsukk...

 

php kunne likegjerne vært arabisk. Noen ganger skjønner jeg overhode ingenting :(

Skrevet

poenget med nl2br er at at "meldingen min med\nNylinje i seg" blir til "meldingen min med<br>Nylinje i seg" og da kan du så vidt jeg vet være sikkert på at en linje er kun en entry :)

 

som da vil si at du kan gå igjennom fila linje for linje og explode() :)

Skrevet
Jeg tipper:

 

Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den.

 

Bedrer seg dersom du sjekker om $lines != '' før du kjører

$e = explode("|", $lines); ?

6838121[/snapback]

Men hvis jeg skriver linjen slik:

"dette er linje 1\n" og skal lese denne inn igjen... hvordan tar jeg høyde for new line da? Jeg kan ikke si at $lines !="\n", siden $lines inneholder "dette er linje1\n" også

6838667[/snapback]

 

Poenget er at når du bruker file() på en fil med en tom linje på slutten, vil du få en verdi i arrayet som er tom.

 

 

foreach($filecontent as $lines){
  if($lines != '') {
      $e = explode("|", $lines);
      $entry = new Entry($e[0], $e[1], $e[2], $e[3]);
      $this->add($entry);   
  } 
}   

 

Skal nok gjøre susen, slik som jeg forstod problemet ditt.

Skrevet
Jeg tipper:

 

Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den.

 

Bedrer seg dersom du sjekker om $lines != '' før du kjører

$e = explode("|", $lines); ?

6838121[/snapback]

Men hvis jeg skriver linjen slik:

"dette er linje 1\n" og skal lese denne inn igjen... hvordan tar jeg høyde for new line da? Jeg kan ikke si at $lines !="\n", siden $lines inneholder "dette er linje1\n" også

6838667[/snapback]

 

Poenget er at når du bruker file() på en fil med en tom linje på slutten, vil du få en verdi i arrayet som er tom.

 

 

foreach($filecontent as $lines){
  if($lines != '') {
      $e = explode("|", $lines);
      $entry = new Entry($e[0], $e[1], $e[2], $e[3]);
      $this->add($entry);   
  } 
}   

 

Skal nok gjøre susen, slik som jeg forstod problemet ditt.

6839871[/snapback]

 

Det høres veldig logisk ut og ser veldig bra ut. Jeg løste det med å serialisere objektet entries og skrive dette til fil.

 

Skal prøve ut din versjon også. Sikker på at den vil fungere!

 

tusen takk!

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...