Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в файл 
:(
    Опции темы
PROme
Дата 20.1.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Плиз!!!
Хелп ламаку!!!
Есть файл, хранящий массив, елементы разделены пробелом, например file.dat содержит:

1 2 3
5 4 7
3 4 5
5 3 8
5 4 3
7 5 4
4 5 3
4 6 3

как измений i-й елемент в j-й строке, например елемент номер 2 в 3-й строке, т.е. четверку на 5 confused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Secandr
Дата 20.1.2004, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Код
$file_text=readfile('bla_bla.txt');
$tmp=split('\n',$file_text);
$line=split(' ',$tmp[$j]);
echo $line[$i];
Хотя медлено работать будет smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 20.1.2004, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



чет я ниче не понял
мне нужно в файле изменить елемент массива, а ты че далconfused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Secandr
Дата 20.1.2004, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



PROme Я после экзамена по термообработке прЕтормаживаю smile.gif

Код
$file_text=readfile('bla_bla.txt');
$tmp=split("\n",$file_text);
$line=split(' ',$tmp[$j]);
$line[$i]='999';//Новое значение
$tmp[$j]=join(' ',$line);
$file_text=join("\n",$tmp);
Хотя можно регулярными выражениями.

Это сообщение отредактировал(а) Secandr - 20.1.2004, 20:52


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 20.1.2004, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Secandr, спасибо, конечно за помощь, но, похоже кто-то чиго-то не понял.

Смотри топик - запись в файл. Собственно именно с этим у меня и проблемы.

Поставлю вопрос проще. Как записать содержимое $bla_bla в файл в нужную строкуconfused.gif

Точнее даже не просто в нужную строку, а обновить (заменить, затереть) существующую старуюconfused.gif

Это сообщение отредактировал(а) PROme - 20.1.2004, 23:34


--------------------
SEO-мастер
PM MAIL WWW   Вверх
[xoodo]
Дата 21.1.2004, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 9.3.2003

Репутация: 1
Всего: 4



Код
$fp=fopen("file.txt", "w")
/*--извлекается инфа и обрабатывается, в массиве заменяется элемент -- см.выше--*/
fputs("file.txt", $file_text); /*--записываем получившийся массив--*/
fclose($fp);

Оно?
PM   Вверх
Sardar
Дата 21.1.2004, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Допустим ты хранишь все числа с одинаковой длинной, т.е. "234"," 23","  2" - если надо дополняешь число пробелами.
Количество таких чисел в строке известно, также известно сколько символов разделяют строку.
Тогда:
Код

function change($file, $index, $value) {
$symbol_length=2; //длинна одной цифры в файле
$separator_length=2; //длинна разделителя \r\n
$symbols_in_row=3; //количество символов в строке
$rowlength=($symbol_length*$symbols_in_row)+$separator_length;

$elements=intval($index/$symbols_in_row)*$rowlength+($index%$symbols_in_row)*$symbol_length; //сколько байтов нужно пропустить

if(!is_resource($fp=fopen($file,"a"))) return false; //не уверн на счет режима
do {'
 @flock($fp, LOCK_EX);
 if($index<0||$elements+$symbol_length>filesize($file)) break; //проверяем на грнаницы
 if(!fseek($fp,$elements,SEEK_SET) break; //сдвигаем указатель
 if(!fwrite($fp, str_pad($value,$symbol_length," ",STR_PAD_LEFT))) break; //условие: у всех элементов длинна одинаковая должно быть сохраненно.
 return fclose($fp);
} while(false)
@fclose($fp);
return false;
}
//применяем
if(!change("test.dat",10,"93")) echo "Oops!";

Не уверен в режиме открытия файла(может надо "r+"). Идея ясна - если мы знаем длинну элементов, то мы знаем сколько надо пропустить, что бы попасть в нужное место.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Secandr
Дата 21.1.2004, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



PROme Лучше хранить данные в виде:
1-2-3;4-5-6;
Или вообще
1-2-3-4-5-6

Так с ними работать проще.

Просто переовд строки в разных ОС разный и могут быть проблемы при переносе (Unix - \n, Windows - \r\n)
Гораздо лучше применять специфические разделители.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
IZ@TOP
Дата 21.1.2004, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Вообще все делается намного проще ... чет Вы тут кашу развели ... особенно Secandr со split'om это же изврат ...
делается все так:
Цитата

function chinum($file, $line, $index, $chinum, $sep = ' ') {

// $file - Файл с данными
// $line - строка в которой надо изменить число
// $index - какой номер в строке у изменяемого числа
// $chinum - на что заменить число
// $sep - не обязательный параметр, определяет чем разделены символы в строке

$dat = file($file);
$chiline = explode($sep, $dat[$line]);
$chiline[$index] = $chinum;
$dat[$line]= join(' ', $chiline[$index]);
return $dat; // Функция возвращает массив для дальнейшей записи.

}

// использовать так:
$data = chinum('file.txt', 2, 2, 7);
// Внимание: порядок следования чисел нумеруется от нуля - что бы изменить первое число в
// строке, надо в качестве индекса ввести 0
$f = fopen('file.txt', "w"); // перезаписываем файл с данными
fputs($f, implode("\r\n", $data)); // Записали
fclose($f); // Закрыли файл ...





--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Secandr
Дата 21.1.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Iz@top В принципе идея была такая же.
А чем split хуже explode ?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 21.1.2004, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



О Боже! Терпение-терпение-терпение...
Всем, конечно, спасибо, но я спрашивал под конец уже, можно ли как-то на ПХП переписать отдельную строку в файле.
Перезапись всего файла не катит из-за раааааааааазмеров файла.


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Sardar
Дата 21.1.2004, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата
Перезапись всего файла не катит из-за раааааааааазмеров файла.

Я так и понял smile.gif.
Ответ: организуй структуру файла так что бы было удобно перемещатся по нему. Так как ты хранишь только числа тебе не нужны заморочки с заголовками, длиннами полей и т.д. С помощью fseek перемещай указатель в нужное положение, пиши то что надо.

Цитата
можно ли как-то на ПХП переписать отдельную строку в файле

Можно если ты знаешь где она находится smile.gif.



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
PROme
Дата 22.1.2004, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



так, ставлю прямой вопрос, плиз КАК заменить 3-ю строку (целиком и полностью) в файле file.txt на содержание переменной $bla_bla confused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Sardar
Дата 22.1.2004, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Если файл очень большой то можно хранить смещения до строк в отдельном файле, сами строки будут заканчиваться специальной последовательностью(впрочем ты можешь также хранить и длины строк).
Ты загружаешь файл со смещениями -> находишь смещение нужной строки -> работаешь со строкой.
Заметь столько гемороя нужно для работы со строками переменной длинны!
Если файл небольшой то лучше использовать file()->implode()->fwrite(), но на могопоточном сервере(Апач) этого делать не стоит, т.к. можешь потерять данные. Обходной путь fopen()->flock(LOCK_EX)->explode()->implode()->fwrite();
Пример
Код

//$indw - длинна индекса в байтах
//$offs - имя файла со смещениями
//$datafile - имя файла с данными
//$separator - разделитель, например '|:|'
//$index - индекс строки
//$value - новая строка
$fp=fopen($offs,'r');
if(!is_resource($fp)||!flock($fp,LOCK_SH)) { //под FAT блокировка работать не будет
 trigger_error('Can\'t open offsets file',E_USER_ERROR);
 return false;
}
fseek($fp,$index*$indw,SEEK_SET); //находим нужное смещение
$offset=intval(fread($fp,$indw)); //считываем смещение
flock($fp,LOCK_UN);
fclose($fp);
//data file
$fp=fopen($datafile,'r+'); //до сих пор не уверен в режиме, мы должны перезаписывать строку
if(!is_resource($fp)||!flock($fp,LOCK_EX);) {
 trigger_error('Can\'t open data file',E_USER_ERROR);
 return false;
 }
fseek($fp,$offset,SEEK_SET); ////сдвигаем указатель на начало строки
if(!($data=fread($fp,4096))||($pos=strpos($data,$separator))<0) {
 trigger_error('Data file is damaged',E_USER_ERROR);
 @fclose($fp);
 return false;
}
if(strlen($data=substr($data,0,$pos))<strlen($value)) {//есть ли место
 trigger_error('No space for data',E_USER_ERROR);//нельзя вставить строку большей длинны в середину файла
 @fclose($fp); //можно добавить в конец файла и подредактировать смещения
 return false;
}
fwrite($fp,$value.$separator);
flock($fp,LOCK_UN); //необязательно
fclose($fp);


Писал с головы так что в коде не уверен. Уже нашел недоделки: каждый раз как только ты записываешь строку меньшей длинны ты уменьшаешь максимальный размер поля =\. Выход хранить длины строк.
Если строка не вмещается в середину ты записываешь ее в конец файла данных и правишь ее смещение. При удалении ты удаляешь ее смещение из файла смещений. Смещения обязанны быть все одной длинны, если надо дополняй пробелами.
Время от врмени перестраиваешь весь файл данных.

ИМXО гиморно это все smile.gif, лучше подумать нужен ли тебе это огромный файл с данными?. Может легче раскидать все по разным файлам или хранить в БД.

Это сообщение отредактировал(а) Sardar - 22.1.2004, 03:12


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Secandr
Дата 22.1.2004, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Можно модернизировать код предложеный Sardar.
Хранить файл в виде:
001001001001001002002002002002003003003003003
который логически может быть представлен в виде:
Код
 1  1  1  1  1
 2  2  2  2  2
 3  3  3  3  3

Смысл в том, что под каждую запись отделяется по 3 байта, в каждой строке 5 записей - 15 байт, тогда:
Код
function change($file, $line, $index, $value) {
$symbol_length=3; //длинна одной цифры в файле
$symbols_in_row=5; //количество символов в строке

$bytes=($symbol_length*$symbols_in_row)*($line-1)+($index*$symbol_length);//сколько байтов нужно пропустить

if(!is_resource($fp=fopen($file,"a"))) return false; //не уверн на счет режима
do {'
@flock($fp, LOCK_EX);
if($index<0||$bytes>filesize($file)) break; //проверяем на грнаницы
if(!fseek($fp,$bytes,SEEK_SET) break; //сдвигаем указатель
if(!fwrite($fp, str_pad($value,$symbol_length," ",STR_PAD_LEFT))) break; //условие: у всех элементов длинна одинаковая должно быть сохраненно.
return fclose($fp);
} while(false)
@fclose($fp);
return false;
}
//применяем
if(!change("test.dat",10,5,"93")) echo "Oops!";

Просто выкидываем все разделители.




--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.