Mastodont
Гость
|
|
« : 10-10-2006 14:20 » |
|
Че то я не совсем понял, в каком режиме происходит открытие файла функцией fopen() с ключами r, r+, w, w+, a, a+, x, x+. В документации написано: r+ открывает файл для чтения и записи; помещает указатель в начало файла. Но при записи, как я понял, содержимое файла сначала полностью затирается, а уже потом туда снова что-то записывается.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 10-10-2006 14:23 » |
|
В чем хоть пишеш? Язык?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Mastodont
Гость
|
|
« Ответ #2 : 10-10-2006 14:35 » |
|
В чем хоть пишеш? Язык?
PHP
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #3 : 10-10-2006 14:53 » |
|
... как я понял, содержимое файла сначала полностью затирается, а уже потом туда снова что-то записывается.
не совсем. Если ты что уже прочитал из файла, а потом стал писать в файл, то прочитанный кусок останется, остальное "затрется". Если хочешь добавить в файл - a+
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Mastodont
Гость
|
|
« Ответ #4 : 10-10-2006 18:12 » |
|
А что за флаги "t" (текстовой трансляции) и "b" (бинарный режим), чем они отличаются?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #5 : 10-10-2006 18:36 » |
|
Бинарный режим - читаеш и пишиш файл as is. Со всеми знаками. Ну и соответственно в текстовом режиме происходит предварительная отработка содержимого файла. Например байт с содержимым 0x00 в текстовом режиме будет отрабатываться как конец файла. Комбинация 0x0A 0x0D будет отрабатываться как завершение строки. Читаеш файл построчно.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Mastodont
Гость
|
|
« Ответ #6 : 10-10-2006 18:44 » |
|
Есть текстовый файл navigation.txt с таким содержанием Есть файл admin.php с тремя формами (формы носят имена odin, dva и tri соответственно): <form action="navigation.php" method="POST"> Первый пункт меню: <input type=text name="odin"><p> Второй пункт меню: <input type=text name="dva"><p> Третий пункт меню: <input type=text name="tri"><p> <input type="submit" value="Сохранить"> </form>
Замысел такой: Сделать так, чтобы сценарием admin.php менять содержимое файла navigation.txt следующим образом: вводим в поле "odin" слово "one", и в navigation.txt, в первой его строке, слово "Один" заменялось словом "one". То есть после ввода "one" в поле с именем "odin" и нажатия на кнопку "Сохранить" текстовый файл navigation.txt должен принять следующий вид: Но он приобретает немного другой вид: Никак не пойму, откуда появилась пустая строка между "Два" и "Три" (символ перевода строки вроде это называется). Работу по изменению файла navigation.txt в соответствии с данными, полученными от admin.php, проделывает сценарий navigation.php. Два последних находятся в одной папке, в которой также присутствует папка Navigation, в которой и лежит файл navigation.txt. Содержимое navigation.php следущее: <?php $navigation=file("Navigation/navigation.txt"); $new_menu=array("odin" => $_POST['odin'], "dva" => $_POST['dva'], "tri" => $_POST['tri']); If (!($_POST['odin'])) { echo "Вы не изменяли 1<br>"; } else { $navigation['0']=$new_menu['odin']; $file=fopen("Navigation/navigation.txt", "w+"); fwrite($file, $navigation['0']); fwrite($file, "\r\n"); fwrite($file, $navigation['1']); fwrite($file, "\r\n"); fwrite($file, $navigation['2']); fclose($file); } If (!($_POST['dva'])) { echo "Вы не изменяли 2<br>"; } else { $navigation['1']=$new_menu['dva']; $file=fopen("Navigation/navigation.txt", "w+"); fwrite($file, $navigation['0']); fwrite($file, "\r\n"); fwrite($file, $navigation['1']); fwrite($file, "\r\n"); fwrite($file, $navigation['2']); fclose($file); } If (!($_POST['tri'])) { echo "Вы не изменяли 3"; } else { $navigation['2']=$new_menu['tri']; $file=fopen("Navigation/navigation.txt", "w+"); fwrite($file, $navigation['0']); fwrite($file, "\r\n"); fwrite($file, $navigation['1']); fwrite($file, "\r\n"); fwrite($file, $navigation['2']); fclose($file); } ?>
Сначала каждая строка navigation.txt становится элементом массива, присвоенного переменной $navigation. Затем (если $_POST['odin'] не есть false) с помощью функции fopen() открывается navigation.txt. После первому элементу массива $navigation, $navigation['0'], присваивается значение $new_menu['odin'] (полученное от формы "odin"). Далее в текстовый файл navigation.txt "с чистого листа" (так как текстовик после открытия в режиме w+ был обрезан до нулевой длины) построчно записывется массив, присвоенный переменной $navigation: в первую строчку navigation.txt записывается значение $navigation['0'], далее перевод курсора на следующую строку, а потом точно также $navigation['1'] и ['2']. Но мой алгоритм почему-то дает сбой, и между первой и второй строками появляется пустая строчка.
|
|
« Последнее редактирование: 07-12-2007 19:42 от Алексей1153++ »
|
Записан
|
|
|
|
Mastodont
Гость
|
|
« Ответ #7 : 12-10-2006 16:27 » |
|
С этим разобрался - надо было удалять пробелы из начала и конца строки, содержащейся в каждом элементе массива. Пытаюсь теперь сделать такую вещь: Скрипт vote.php должен открыть текстовый файл yes.txt или no.txt (какой именно - зависит от полученных скриптом данных), прочитать содержимое одного из этих файлов, обрезать сам файл до нулевой длины, затем инкрементировать то значение, что было считано до обрезания, инкрементировать это значение и записать его в текстовый файл. Но почему то после вызова функции ftruncate() в текстовик уже ничего писаться не хочет, да и обрезается файл как-то странно: там появляется два пробела, а по ни должно быть ни одного - обрезается-то до нуля. Содержимое vote.php: <?php If ($_POST['vote']==="yes") { $vote_file=fopen("yes.txt", "r+"); $soderzh_vote=fread($vote_file, 2); ftruncate($vote_file, 0); $soderzh_vote++; fwrite($vote_file, $soderzh_vote); fclose($vote_file); } else { $vote_file=fopen("no.txt", "r+"); $soderzh_vote=fread($vote_file, 2); ftruncate($vote_file, 0); $soderzh_vote++; fwrite($vote_file, $soderzh_vote); fclose($vote_file); } ?>
|
|
« Последнее редактирование: 07-12-2007 19:43 от Алексей1153++ »
|
Записан
|
|
|
|
Mastodont
Гость
|
|
« Ответ #8 : 15-10-2006 07:09 » |
|
Заработало. Еще вопрос: У меня иногда бывает так, что файл не хочет инклюдиться: "Warning: main(z:/home/localhost/www/cite/Navigation/vote_question.txt): failed to open stream: No such file or directory in z:\home\localhost\www\cite\admin\vote-vote.php on line 3". Но во время других попыток он инклюдиться прекрасно. То есть иногда он оказывается как бы заблокирован. Например, вчера include('z:/home/localhost/www/cite/Navigation/vote_question.txt'); (это содержимое 3 линии) работало нормально, а сегодня выдает вышеуказанное сообщение, причем расположение файлов "со вчера на сегодня" не изменялось. Текстовый файл vote_question.txt распологается в папке Navigation, а скрипт vote-vote.php находится в Admin. Папки Navigation и Admin располагаются в директории cite. В чем тут может быть причина?
|
|
« Последнее редактирование: 07-12-2007 19:44 от Алексей1153++ »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #9 : 15-10-2006 09:22 » |
|
Mastodont, ты часом одновременно с запуском не редактировал файл?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mastodont
Гость
|
|
« Ответ #10 : 15-10-2006 10:24 » |
|
Всмысле, vote_question.txt во время подключения мог быть открыт в текстовом редакторе? Не, такого не было. Да, vote_question.txt инклюдится еще и в страницу index.php (но одновременно с vote-vote.php я index.php не запускал). Это могло как-нибудь повлиять? По идее один и тот же файл можно подключать посредством include() в какое угодно количество страниц.
|
|
|
Записан
|
|
|
|
Chuda
Гость
|
|
« Ответ #11 : 15-10-2006 10:27 » |
|
Mastodont, скажи, во время каких попыток он инклюдится, а во время каких - нет, закономерность какую-нибудь видать? как инклюдишь - адрес абсолютный или относительный? А не то сейчас расскажу о том, что виндавсмастдай, ну или о кривых руках, ну или ещё что-нибудь неинтересное.
|
|
|
Записан
|
|
|
|
Mastodont
Гость
|
|
« Ответ #12 : 15-10-2006 15:54 » |
|
Все, разобрался. Я там с путями к файлам немного запутался, от этого и ошибка была )
|
|
|
Записан
|
|
|
|
Mastodont
Гость
|
|
« Ответ #13 : 18-10-2006 15:52 » |
|
А че может значить надпись Parse error: parse error, unexpected $end Че за "$end"?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #14 : 18-10-2006 17:45 » |
|
Mastodont, учи английский! У тебя синтаксическая ошибка: "$end" там где не должно быть.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mastodont
Гость
|
|
« Ответ #15 : 18-10-2006 18:11 » |
|
В моейм скрипте сочетания символов "$end" вообще нету. В чем ошибка тогда?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #16 : 18-10-2006 18:27 » |
|
Mastodont, значит ты косвено, через include или require, используешь файл, в котором и есть ошибка. Кстати, php пишет имя файла и номер строки, в которых нашел ошибку...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mastodont
Гость
|
|
« Ответ #17 : 18-10-2006 18:46 » |
|
Указывает на самую последнюю строчку, содержащую "?>". Перед ней строчка со скобкой цикла If. Причем в этом скрипте никаких файлов через include и require не подключается.
|
|
|
Записан
|
|
|
|
Chuda
Гость
|
|
« Ответ #18 : 18-10-2006 20:49 » |
|
точно виндавсмастдай.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #19 : 19-10-2006 19:44 » |
|
Mastodont, ты пользуешься каким-нибудь редактором с подсветкой синтаксиса? Рекомендую! Это помогает находить такие ошибки, как пропущенная кавычка или скобка. Подобные ошибки часто приводят к сообщениям об ошибках совсем в не там, где реально допущена ошибка.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mastodont
Гость
|
|
« Ответ #20 : 20-10-2006 13:44 » |
|
Ага, Bred'ом пользуюсь. Правда, иногда подсветку отрубаю, потому что в глазах от разноцветного кода рябит ( А что может означать такой ответ браузера?: Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING Не понимаю, что значит "T_ENCAPSED_AND_WHITESPACE" и ему подобные.
|
|
« Последнее редактирование: 07-12-2007 19:45 от Алексей1153++ »
|
Записан
|
|
|
|
Chuda
Гость
|
|
« Ответ #21 : 20-10-2006 21:30 » |
|
такой ответ сервера (а было бы неплохо привести его полностью, а заодно и строку, на которую он указывает) означает синтаксическую ошибку. Полагаю, что она в коде заметна сразу.
|
|
|
Записан
|
|
|
|
|