Проинклюдить переменную

1) через fseek перемещаемся к нужной записи
типа fseek($fh, №_записи * фикс_длина_записи, SEEK_CUR);
2) потом читаем fgets($file, фикс_длина_записи);
----
запись примерно также
1) --- // --- // --- // --- //
2) fwrite($file, $content)
$content соответственно с подогнанным размером


но при этом записи должны иметь фиксированную длину
т.е. не должны быть строки вида
Код:
$1 =1;
$2 =2123123;
а должно быть что-то типа
Код:
$1 =1      ;т.е. строка дополнена мусором  до фикс. длины
$2 =2123123;
 
Малеха не догнал. Длина у меня одинаковая - это я забыл сказать.
То есть получается примерно следующее?
fseek($fh, 1 * 1, SEEK_CUR);
//у меня получается номер строки 1 и длина 1
// номер записи это я как понял номер строки?
fgets($file, 1);// переменная файл от куда взялась? Или мы в нее считываем?
 
>>>fseek($fh, 1 * 1, SEEK_CUR);
>>>//у меня получается номер строки 1 и длина 1

примерно так, только нужно ( номер - 1 ) * размерБлока, т.к. в противном случае мы будет устанавливать указатель вконец нужного блока а нужно вить в его начало что-бы считать .. т.е. "в конец предыдущего блока" .. это я тупанул


>>>// номер записи это я как понял номер строки?
не совсем ... номер записи - это номер "блока" данных который нужно считать/записать


>>>fgets($file, 1);// переменная файл от куда взялась? Или мы в нее считываем?

$file - это хендел файла ... все файловые ф-ции работают с ним
т.е. перед вызовом их нужно открыть файл или создать ...



-------------------------
к примеру есть файл test.txt с след. содержимым
Код:
111222333444555666777888999

если его "разложить" по вашему примеру то будет что-то типа

$1=111;
$2=222;
$3=333;
$4=444;
....

предположительно в нем записано 9 чисел ( 9 блоков ) каждый длиной в 3 байта
т.е. минимальное хранимое значение 0, а максимально 999
если нужно больше - то увеличьте на байт длину блока и будет уже макс. 9999 ... ну и так далее ...

ну а далее считаем 4 блок данных
PHP:
    $dataSize = 3; // размер блока данных в байтах 
    $readBlokNomer = 4; // номер блока который нужно изменить 
  
    $file = fopen('test.txt','r+');
    fseek($file, ($readBlokNomer-1)*$dataSize);  
    $data = (int)fgets($file, $dataSize+1); //хз зачем тут +1
    $data++;  // инкриментируем ... 
    /**
    * ну и нужно проверить не перевалило ли значение за приделы блока ...
    * а то при записи его урежит .. 
    */
    fseek($file, ($readBlokNomer-1)*$dataSize);
    // str_pad дополняем пробелами (муссором) до нужной длины 
    fputs($file, str_pad($data, $dataSize, ' ', STR_PAD_RIGHT));
    fclose($file);


ну и должно получиться что-то типа ...
Код:
111222333445555666777888999
т.е. достали 4 блок "444" и увеличили на 1 - вышло => "445"
 
как вам такое решение?

PHP:
/**
 * Get row value in file
 *
 * @param   integer     Row number
 * @param   string      [Optional] File name
 * @return  mixed
 */
function getFileRow( $row, $file = 'data.txt' )
{
	static $files = array();
	
	if ( empty( $files[$file] ) )
	{
		$files[$file] = file( $file );
	}
	
	$line = $files[$file][--$row]; // нумерация в file() идет с нуля, поэтому декрементируем переменную $row
	
	return trim( substr( $line, strrpos( $line, '=' ) + 1 ), ';' );
}
 
как вам такое решение?
.........
данное решение хранит в памяти данные всего файла
более того, эти данные накапливаются из всех файлов которые будут открываться этой ф-цией в статической переменной

при небольших файлах вполне можно использовать, но в противном случае будет ненужный расход памяти



Sachok321; написал(а):
Как мне в этом скрипте выбрать именно 3 строку к примеру?

как-то так
PHP:
$row = getFileRow(3, 'fileName.txt' );
 
данное решение хранит в памяти данные всего файла
более того, эти данные накапливаются из всех файлов которые будут открываться этой ф-цией в статической переменной
при небольших файлах вполне можно использовать, но в противном случае будет ненужный расход памяти
как-то так
PHP:
$row = getFileRow(3, 'fileName.txt' );
А как то можно обнулить это накапливание? А то лишний расход ресурсов не оч хоцеца :)
 
я приводил в пример эту функцию, если нужно много раз брать данные
для одной выборке во всем скрипте:

PHP:
function getFileRow( $row, $file = 'fileName.txt' )
{
    $lines = file( $file );
    $line = $lines[$row - 1];
    return trim( substr( $line, strrpos( $line, '=' ) + 1 ), ';' );
}

как-то так :)
 
я приводил в пример эту функцию, если нужно много раз брать данные
для одной выборке во всем скрипте:
PHP:
function getFileRow( $row, $file = 'fileName.txt' )
{
    $lines = file( $file );
    $line = $lines[$row - 1];
    return trim( substr( $line, strrpos( $line, '=' ) + 1 ), ';' );
}
как-то так :)

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