Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ключи функции fopen()  (Прочитано 24895 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mastodont
Гость
« : 10-10-2006 14:20 » 

Че то я не совсем понял, в каком режиме происходит открытие файла функцией fopen() с ключами r, r+, w, w+, a, a+, x, x+. В документации написано: r+ открывает файл для чтения и записи; помещает указатель в начало файла. Но при записи, как я понял, содержимое файла сначала полностью затирается, а уже потом туда снова что-то записывается.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 10-10-2006 14:23 » 

В чем хоть пишеш? Язык?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mastodont
Гость
« Ответ #2 : 10-10-2006 14:35 » 

В чем хоть пишеш? Язык?
PHP
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 10-10-2006 14:53 » 

... как я понял, содержимое файла сначала полностью затирается, а уже потом туда снова что-то записывается.
не совсем. Если ты что уже прочитал из файла, а потом стал писать в файл, то прочитанный кусок останется, остальное "затрется".
Если хочешь добавить в файл - a+
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Mastodont
Гость
« Ответ #4 : 10-10-2006 18:12 » 

А что за флаги "t" (текстовой трансляции) и "b" (бинарный режим), чем они отличаются?
Записан
Finch
Спокойный
Администратор

il
Offline 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 должен принять следующий вид:
Код:
One
Два
Три
Но он приобретает немного другой вид:
Код:
One
Два
 
Три
Никак не пойму, откуда появилась пустая строка между "Два" и "Три" (символ перевода строки вроде это называется). Работу по изменению файла navigation.txt в соответствии с данными, полученными от admin.php, проделывает сценарий navigation.php. Два последних находятся в одной папке, в которой также присутствует папка Navigation, в которой и лежит файл navigation.txt.
Содержимое navigation.php следущее:
Код:
<?php
 
$navigation
=file("Navigation/navigation.txt");
 
$new_menu=array("odin" => $_POST[&#39;odin&#39;], "dva" => $_POST[&#39;dva&#39;], "tri" => $_POST[&#39;tri&#39;]);
 
If (!($_POST[&#39;odin&#39;]))
 
{
  echo 
"Вы не изменяли 1<br>";
 }
  else
 {
   
$navigation[&#39;0&#39;]=$new_menu[&#39;odin&#39;];
   
$file=fopen("Navigation/navigation.txt""w+");
 
   
fwrite($file$navigation[&#39;0&#39;]);
   
fwrite($file"\r\n");
   
fwrite($file$navigation[&#39;1&#39;]);
   
fwrite($file"\r\n");
   
fwrite($file$navigation[&#39;2&#39;]);
 
   
fclose($file);
 }
 
If (!(
$_POST[&#39;dva&#39;]))
 
{
  echo 
"Вы не изменяли 2<br>";
 }
  else
 {
  
$navigation[&#39;1&#39;]=$new_menu[&#39;dva&#39;];
  
$file=fopen("Navigation/navigation.txt""w+");
 
  
fwrite($file$navigation[&#39;0&#39;]);
  
fwrite($file"\r\n");
  
fwrite($file$navigation[&#39;1&#39;]);
  
fwrite($file"\r\n");
  
fwrite($file$navigation[&#39;2&#39;]);
 
  
fclose($file);
 }
 
If (!(
$_POST[&#39;tri&#39;]))
 
{
  echo 
"Вы не изменяли 3";
 }
  else
 {
  
$navigation[&#39;2&#39;]=$new_menu[&#39;tri&#39;];
  
$file=fopen("Navigation/navigation.txt""w+");
 
  
fwrite($file$navigation[&#39;0&#39;]);
  
fwrite($file"\r\n");
  
fwrite($file$navigation[&#39;1&#39;]);
  
fwrite($file"\r\n");
  
fwrite($file$navigation[&#39;2&#39;]);
 
  
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[&#39;vote&#39;]==="yes")
 
{
  
$vote_file=fopen("yes.txt""r+");
  
$soderzh_vote=fread($vote_file2);
  
ftruncate($vote_file0);
  
$soderzh_vote++;
  
fwrite($vote_file$soderzh_vote);
  
fclose($vote_file);
 }
  else
 {
  
$vote_file=fopen("no.txt""r+");
  
$soderzh_vote=fread($vote_file2);
  
ftruncate($vote_file0);
  
$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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 18-10-2006 17:45 » 

Mastodont, учи английский! У тебя синтаксическая ошибка: "$end" там где не должно быть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mastodont
Гость
« Ответ #15 : 18-10-2006 18:11 » 

В моейм скрипте сочетания символов "$end" вообще нету. В чем ошибка тогда?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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 » new

такой ответ сервера (а было бы неплохо привести его полностью, а заодно и строку, на которую он указывает) означает синтаксическую ошибку. Полагаю, что она в коде заметна сразу.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines