/ / PHP dostať posledný riadok otvoreného súboru handle s viacerými riadkami - php, filehandle, spracovanie súborov, fgetc

PHP získa posledný riadok otvoreného súborového popisu s viacerými riadkami - php, filehandle, file-processing, fgetc

Zdá sa, že by to mala byť jednoduchá vecale ja som "m s trochu problémy s fgetc () pri návrate posledný riadok otvorený súbor handle.What som" m snaží robiť, je vrátiť posledný riadok napísaný na rukoväť, mám nasledujúce, ktorý funguje, ak rukoväť má len jeden riadok:

function getLastLineFromHandle($handle)
{

$seeker = function($handle) use (&$seeker) {

fseek($handle, -1, SEEK_CUR);

return ftell($handle) ?
$seeker($handle) :
$handle;
};

return trim(fgets($seeker($handle)));
}

$handle = fopen("php://temp", "w+");
fwrite($handle, "Hello World".PHP_EOL);

//prints Hello World
print getLastLineFromHandle($handle);

Problém je, keď mám na rukoväti zapísaných viacero riadkov, pridaním fgetc () do kontrolnej podmienky sa zdá, že nefunguje napríklad:

function getLastLineFromHandle($handle)
{

$seeker = function($handle) use (&$seeker) {

fseek($handle, -1, SEEK_CUR);

return ftell($handle) && fgetc($handle) != PHP_EOL ?
$seeker($handle) :
$handle;
};

return trim(fgets($seeker($handle)));
}

Toto sa vráti prázdne, ak sa na riadok zapíše viacero riadkov a fgetc ($ handle) sa vždy vráti k rovnakému znaku?

"Som si istý, že je niečo veľmi jednoduché, že som zmeškal, ale všetky ukazovatele by boli skvelé, pretože ma to zbláznilo!"

Vďaka.

odpovede:

0 pre odpoveď č. 1

Zistilo sa, čo chýbalo z vyššie uvedeného príkladu, ukáže sa, že v prípade, že sa na ukazovateli na začiatku vyskytol neočakávaný koniec znaku, tak sa posunie jedna pozícia do vyriešenia problému, napríklad:

function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -2, SEEK_CUR);

return ftell($handle) && fgetc($handle) != PHP_EOL ?
$seeker($handle) :
$handle;
};

return trim(fgets($seeker($handle)));
}

Pri skúmaní som našiel aj ďalší spôsob, ako urobiť to isté, a to vďaka komentáru @ TheMarlboroMan o snahe o dosiahnutie tohto cieľa:

function getLastLineFromHandle($handle)
{
$seeker = function($handle, $cur = -2, $line = "") use (&$seeker)
{
$char = "";
if (fseek($handle, $cur, SEEK_END) != -1) {
$char = fgetc($handle);
$line = $char.$line;
}

return ftell($handle) > 0 && $char != PHP_EOL?
$seeker($handle, $cur-1,$line) :
$line;
};

return trim($seeker($handle));
}

To však neprešlo cez refaktorovú slučkuprechádza rovnakými testami ako vyššie uvedená metóda. Toto riešenie sa zdá byť trochu chaotický, ak chcete vrátiť riadok reťazca namiesto popisovača, pretože to je to, čo by ste očakávali.

Nastavenie ako vyriešené, ale otvorené pre komentáre, ak má niekto iný spôsob :)