Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP]Vreemde resultaten bij fwrite

Pagina: 1
Acties:

Onderwerpen


  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
Ik ben bezig met een schrijven van een file editor class die statisch aangeroepen moet worden.
Alle functies die erin zitten werken onafhankelijk van elkaar prima, maar de functies append en prepend lijken elkaar in de weg te zitten bij gelijktijdig gebruik. Als ik in het zelfde programma eerst een append aanroep om data bij te schrijven en vervolgens een prepend (of andersom, zelfde gedrag) dan overschrijft append ineens de laatste tekens in de zin gelijk aan de lengte van de nieuwe in te voegen zin + 3 extra tekens. Ik zal het wel zo vaag omschrijven als dat het ook daadwerkelijk is, maar misschien zie ik iets over het hoofd.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class FileEditor {
        protected static function fwrite($filename, $data, $type, $arg=false){
        $fh = self::open($filename, $type);
        
        $bytes = filesize($filename);
        $filedata = "";
        if($bytes == 0) $bytes = (self::DEFAULT_FILE_SIZE*1024);                                            // if filesize returned 0 either the file was empty or it could not retreive size. Try to read 128KB default
        $filedata = fread($fh, $bytes);
        
        switch($type){
            case self::WRITE        : $newdata = $data;                                                                         // no data manipulation needed, overwriting file
                                                        break;
            case self::APPEND       : $newdata = $filedata.$data;                                                       // place data at end of file                                        
                                                        break;
            case self::PREPEND  :   $newdata = $data.$filedata;                                                     // place data at beginning of file
                                                        break;
            case self::INSERT_RX:   if(!is_int($arg["multiple"])) $arg["multiple"] = 1;     // number of occurrences to be replaced
                                                        if(($newdata = preg_replace($arg["pattern"], $data, $filedata, $arg["multiple"])) === NULL) return self::Error("Could not replace data", 5200);
                                                        break;
            case self::INSERT       : if(!$arg || !is_int($arg)) return self::Error("Linenumber not found", 5200);
                                                        $lines = file($filename);
                                                        
                                                        if(count($lines) == 0) $newdata = $data;
                                                        else if($arg > count($lines)) $newdata = $filedata.$data;
                                                        else {
                                                            $newdata = "";
                                                            for($i = 0; $i < count($lines); $i++){
                                                                $newdata .= $lines[$i];
                                                                if($i == ($arg-1)) $newdata .= $data;
                                                            }
                                                        }
                                                        break;
        }
        
        if($newdata == "") $newdata = "\n";
        
        $result = false;
        ftruncate($fh, 0);
        rewind($fh);
        $result = fwrite($fh, $newdata);
        
        self::close($fh);
        if(!$result) return self::Error("Could not write to file.", 5201);
        
        return true;
    }
}

In een debug sessie werd bij alle aanroepen van prepend en append het bestand wel volledig ingelezen en klopte de gegevens voordat ze weggeschreven zouden worden.

telefoontoestel


  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

Ik vermoed dat je ook even een:
PHP:
1
rewind($fh);
moet doen voor je fread (of standaard doen in je FileEditor::open functie). Kan niet anders bedenken dan dat het met de file-pointer te maken heeft.

... MMORPG Addict.


Verwijderd

Is het niet praktischer om met file_get_contents() je huidige bestand te lezen, en met file_put_contents() het nieuwe bestand te schrijven?

Ik denk inderdaad dat je met een file-pointer probleem zit.
In welke mode open je het bestand?
Volgens mij zou dat r+ moeten zijn, aangezien je zowel leest als schrijft in hetzelfde bestand.
Deze mode zet ook meteen de file-pointer aan het begin van het bestand.

[ Voor 3% gewijzigd door Verwijderd op 09-03-2011 23:19 ]


  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
Ik heb nu net pas gelegenheid gehad ernaar te kijken. Rewind helpt niet bij het probleem dus het zit niet in de filepointer. Achteraf bezien is dat ook niet helemaal logisch aangezien het bij het lezen van het bestand wel de volledige inhoud opgeslagen wordt in de variabele (gecontroleerd) en voor de rewind wordt het bestand geleegd en wordt met rewind de pointer terug naar het begin geplaatst. Pas hierna wordt de data weg geschreven.

De mode waarin het bestand geopend wordt is afhankelijk van de gewenste actie 'w' of 'c+'. Bij beide acties wordt met het openen de filepointer automatisch al terug gezet naar het begin.

Ik heb nu de 2 genoemde functies gebruikt en het lijkt erop dat dit wel werkt. Bedankt voor de hulp, maar toch blijft het een vreemd verhaal.

telefoontoestel