Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 20:18

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Перенос строк в файле и SPF.
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Можно и мелкими блоками читать, просто фиксировать, когда конец строки достигнут при чтении, а когда нет. Если нет, следующую считанную порцию приклеивать к остатку предыдущей.
А остатком считать "слово, которое закончилось не пробелом, концом буфера" (если на конце был пробел - остаток - пустая строка)
Сообщение Добавлено: Ср янв 27, 2010 19:11
  Заголовок сообщения:   Ответить с цитатой
in4 писал(а):
А, кстати, как можно решить такие проблемы?

во-первых, можно искать только один символ 0x0D а не последовательность из двух.
во-вторых, можно грузить в память файл целиком (памяти для этого сейчас хватает) ограничение, слишком большие файлы не будут загружаться (слишком большие, это больше ~1.5GB на файл)
можно совместить решения, большие файлы читать построчно (или поблочно) а маленькие целиком (так сделано в форке)
Сообщение Добавлено: Ср янв 27, 2010 13:17
  Заголовок сообщения:   Ответить с цитатой
В начале файла обзательное слово о типе CR и без него вообоще файл не загружать

впрочем, если учесть, что CR в одном типе состоит из одного символа, а в другом - из двух = можно определять автоматически
Сообщение Добавлено: Ср янв 27, 2010 01:25
  Заголовок сообщения:   Ответить с цитатой
А, кстати, как можно решить такие проблемы?
Ведь, как я понимаю, такая же проблема будет если файл читать блоками (используя BLOCK) и строка или число попадет на границу?
И при страничной организации (тоже через блоки) виртуальной памяти снова это же будет?
Интересуют красивые решения. ;)
Сообщение Добавлено: Ср янв 27, 2010 00:58
  Заголовок сообщения:   Ответить с цитатой
ээм, с проблемой разобрались уже.
дело в том, что файл в СПФе грузится не целиком, а построчно, с помощью операции REFILL
эта самая REFILL ищет последовательность 0x0D 0x0A и обрезает строку в буфере по эту последовательность.
соответственно, если последовательность не встречается, а длина файла больше буфера, то на конце может воозникнуть ошибка, так как слово, находящееся на границе буфера будет разрезано.
Сообщение Добавлено: Вт янв 26, 2010 18:44
  Заголовок сообщения:   Ответить с цитатой
В виндовсе в конец строки надо вписывать 0D0A, в юниксе - только 0D (или только 0A, не уверен, как правильно).
А программе должно быть пофиг, где она работает, и вывод конца строки должен обрабатываться автоматом.
Вывели строку, выводящее слово само добавило нужный конец строки, а не программисту об этом репу чесать.

p.s. А у меня проблем нет...
Сообщение Добавлено: Пн ноя 17, 2008 19:21
  Заголовок сообщения:   Ответить с цитатой
WingLion
Не совсем понял. А какие с этим проблемы?
Сообщение Добавлено: Пн ноя 17, 2008 12:29
  Заголовок сообщения:   Ответить с цитатой
А при выводе файлов - программисту мудохаться с определением того, какая система, какой конец строки вписывать в конец?
Сообщение Добавлено: Вс ноя 16, 2008 08:16
  Заголовок сообщения:   Ответить с цитатой
chess писал(а):
seu писал(а):
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.

Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A
(см. файл spf_win_io.f)
Ну я и спрашиваю, почему бы не определить концом строки и 0D, и 0A. Ну, будет пустая строка, но Форту-то всё равно. Зато работать будет со всеми файлами без всяких UNIX-LINES и DOS-LINES.
Сообщение Добавлено: Вс ноя 16, 2008 06:08
  Заголовок сообщения:   Ответить с цитатой
Файл обрабатывается как одна строка (т.к. разделитель не найден) и первый же комментарий до (остутствующего) конца строки "съедает" весь файл.
Конец строки можно установить явно словами UNIX-LINES и DOS-LINES.
Вообще, используйте решение приведённое в тикете (правда оно там не очень "правильное", но рабочее)
Сообщение Добавлено: Пт ноя 14, 2008 23:53
  Заголовок сообщения:   Ответить с цитатой
seu писал(а):
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.

Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A
(см. файл spf_win_io.f)
Сообщение Добавлено: Чт ноя 13, 2008 20:11
  Заголовок сообщения:   Ответить с цитатой
seu писал(а):
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.
Код:: IsDelimiter1 ( char -- flag ) BL 1+ < ;
VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiterИли это не так?


Верно в СПФе так и есть, разделителем считается все, что имеет код 32 и меньше. Не знаю, как в стандарте (лень туда смотреть), так было не во всех фортах. Были и такие, в которых кодом разделителя был только пробел = 32, остальные символы включая ноль могли находиться в именах. Была даже такая шутка, как слово REFILL, код которого был = 0x0D0A.
Сообщение Добавлено: Чт ноя 13, 2008 19:24
  Заголовок сообщения:   Ответить с цитатой
И вообще, какой смысл искать 0D0A и считать его за разделитель, когда можно искать и 0D, и 0A, и если находить их в паре, считать за два разделителя. Форту ведь всё равно, сколько их там будет.
Сообщение Добавлено: Ср ноя 12, 2008 23:28
  Заголовок сообщения:   Ответить с цитатой
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.
Код:
: IsDelimiter1 ( char -- flag )
  BL 1+ <
;
VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiter
Или это не так?
Сообщение Добавлено: Ср ноя 12, 2008 23:14
  Заголовок сообщения:   Ответить с цитатой
https://sourceforge.net/tracker/index.p ... tid=367919
Сообщение Добавлено: Ср ноя 12, 2008 10:47

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB