Gå til innhold

Lesing og skriving fra fil


Anbefalte innlegg

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
Lenke til kommentar
Videoannonse
Annonse
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å

Lenke til kommentar

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

Lenke til kommentar
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 :(

Lenke til kommentar

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

Lenke til kommentar
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.

Lenke til kommentar
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!

Lenke til kommentar

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å
×
×
  • Opprett ny...