буферизация — использование данных переменной длины из буфера фиксированной длины в переполнении стека

У меня такой большой файл, что я не могу прочитать его в строку за один раз, но мне нужно использовать буферизацию:

$fp = @fopen("bigfile", 'rb');
while (!feof($fp)) {
//process buffer
}

Для простоты, скажем, файл содержит последовательность пар целочисленных строк, где целое число содержит длину строки. Тогда код, который я хочу реализовать в process buffer, является unpack int, прочитайте столько символов из буфера, затем повторите.

Я ценю любые предложения по работе со сценарием, где строка охватывает один буфер для следующего. Я уверен, что эта проблема, должно быть, была решена, и что для этого есть шаблон дизайна, я просто не знаю, с чего начать.

Любая помощь будет оценена.

0

Решение

Не уверен, что вы ищете сверхумное решение, но прямолинейно будет:

while (!feof($fp)) {
$len = fread($fp, 2); // integer-2 bytes ...?
// <--- add checks here  len($len)==2 and so on...
$len = unpack('S', $len); // pick the correct format character from http://docs.php.net/function.pack

while(!feof($fp) && $len) {
$cbRead = $len < MAX_CHUNK_LEN ? $len : MAX_CHUNK_LEN;
$buf = fread($fp, $cbRead);
// <--- add checks here  len($buf)==$cbRead and so on...
$len -= $cbRead;
// ... process buf
}
if ( $len!=0 ) {
errorHandler();
}
else {
processEndOfString();
}
}
1

Другие решения

Других решений пока нет …