Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Чтение и запись в файл
 
 автор: anonymous   (28.07.2008 в 01:34)   письмо автору
 
 


                                                     $file = fopen ("data.txt","a+");
                if ( $file )
                {
                    rewind ($file);
                    $c = fread ($file, 2);        
                    $num1 =  fread ($file, 1);
                    $num2 =  fread ($file, 1);
                    $num3 =  fread ($file, 1);
                                                                   #.....изменяю эти 3 переменые
                    rewind($file);
                    fputs ($file, "##".$num1.$num2.$num3);
                    fclose ($file);
                }


В итоге. В текстовом файле сначала идут старые переменные ,а затем новые. А надо вписать новые переменные в начало. В чем проблема?!

То есть необходимо -
сначала файл - ##123
затем файл - ##567##123

  Ответить  
 
 автор: Trianon   (28.07.2008 в 02:10)   письмо автору
 
   для: anonymous   (28.07.2008 в 01:34)
 

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

  Ответить  
 
 автор: anonymous   (28.07.2008 в 02:17)   письмо автору
 
   для: Trianon   (28.07.2008 в 02:10)
 

Это печально. Крайне печально.
Неужели нет никакого способа?

  Ответить  
 
 автор: pav1uxa   (28.07.2008 в 15:59)   письмо автору
 
   для: anonymous   (28.07.2008 в 02:17)
 

Походу такие правила) Читать файл можно только сначала, ДОписывать в файл можно только в конец.

Единственный вариант в вашем случае:
1. считать файл, запомнить что в нем было, сохранить в переменную,
2. записать в файл новые данные, удалив при этом старые,
3. дописать то что в нем было.

  Ответить  
 
 автор: anonymous   (29.07.2008 в 01:00)   письмо автору
 
   для: pav1uxa   (28.07.2008 в 15:59)
 

Все верно. Так и реализовал.

  Ответить  
 
 автор: Trianon   (29.07.2008 в 10:05)   письмо автору
 
   для: pav1uxa   (28.07.2008 в 15:59)
 

>Походу такие правила) Читать файл можно только сначала,
Это совсем не так. читать файл можно в произвольных местах. Нужно лишь знать позицию, с которой читать. Правда, ОС все операции будет оптимизировать из расчета последующего чтения вперед.

>ДОписывать в файл можно только в конец.
Это верно.

>Единственный вариант в вашем случае:
>1. считать файл, запомнить что в нем было, сохранить в переменную,
>2. записать в файл новые данные, удалив при этом старые,
>3. дописать то что в нем было.

Соответственно и вариант не единственный.
В принципе, в некоторых ситуациях можно дописывать данные в хвост, а файл читать в от конца к началу.

  Ответить  
 
 автор: cheops   (29.07.2008 в 14:41)   письмо автору
 
   для: anonymous   (28.07.2008 в 02:17)
 

>Это печально. Крайне печально.
>Неужели нет никакого способа?
Файл у вас большого размера достигает? Если файл маленький (в районе полумегабайта) можно перед записью читать его содержимое, разбив на массив (при помощи функции file) добавить в начало массива новую запись, а потом записать массив (предварительно объединив его в строку при помощи функции implode()) в файл (перезаписав, все, что там имеется).

  Ответить  
 
 автор: anonymous   (29.07.2008 в 21:20)   письмо автору
 
   для: anonymous   (28.07.2008 в 01:34)
 


<?
            $file 
fopen("file.txt","w+");
            
fwrite ($file"111\n");
            
fwrite ($file"222");
            
fclose($file);
?>


А в файл записывает 111?222
где на месте "?" квадратик.
Как правильно записать перенос строки в файл?

  Ответить  
 
 автор: cheops   (30.07.2008 в 14:16)   письмо автору
 
   для: anonymous   (29.07.2008 в 21:20)
 

Блокнот Windows не понимает UNIX-перевод строки \n, ему нужен Windows-перевод строки \r\n
<? 
            $file 
fopen("file.txt","w+"); 
            
fwrite ($file"111\r\n"); 
            
fwrite ($file"222"); 
            
fclose($file); 
?>

  Ответить  
 
 автор: sim5   (30.07.2008 в 14:28)   письмо автору
 
   для: cheops   (30.07.2008 в 14:16)
 

Ну почему, echo "as\nas\nas";, а потом просмотреть исходный код - в Блокноте запись будет столбиком.

  Ответить  
 
 автор: cheops   (30.07.2008 в 14:36)   письмо автору
 
   для: sim5   (30.07.2008 в 14:28)
 

Под Windows, да. А теперь гляньте, поведение скрипта под UNIX http://www.softtime.ru/get.php. Это связано с тем, что при записи результирующего HTML-кода включается текстовый режим t, вместо бинарного b. Текстовый режим автоматически подставляет перевод строки, принятый для операционной системы (В Windows - \r\n, в FreeBSD - \n).

  Ответить  
 
 автор: anonymous   (31.07.2008 в 00:24)   письмо автору
 
   для: cheops   (30.07.2008 в 14:16)
 

Ок, помогло, спасибо.

К слову, в C++
printf( f, "asdfasdf\nasdfasdf");


запишется нормально - с переносом строки, без использования \r\n. В чем дело?

  Ответить  
 
 автор: cheops   (01.08.2008 в 14:37)   письмо автору
 
   для: anonymous   (31.07.2008 в 00:24)
 

Опять же дело в операционных системах - под Windows и ваш код будет в Блокноте нормально открываться, однако, если C++-программа будет выполняться в UNIX-среде. Будет та же петрушка. Бинарный и текстовый режимы записи файлов по сути из C и идут. Файлы - это компетенция операционной системы, поэтому языки пытаются использовать по-максимуму особенности каждой конкретной операционной системы.

PS Проблема в том, что в качестве операционной системы на клиентских машинах мы предпочитаем Windows, а на серверах UNIX-подобные операционные системы. Отсюда ноги и растут, когда ваша программа или скрипт работают в одной среде, все нормально. А когда Блокнот и скрипт в разных - начинаются проблемы. Вообще говоря это свойство блокнота - его так запрограммировали, все нормальные редакторы, понимают любые переводы строк.

  Ответить  
 
 автор: anonymous   (01.08.2008 в 16:42)   письмо автору
 
   для: cheops   (01.08.2008 в 14:37)
 

Ок, внятное обьяснение, спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования