Forth http://fforum.winglion.ru/ |
|
Перенос строк в файле и SPF. http://fforum.winglion.ru/viewtopic.php?f=18&t=1656 |
Страница 1 из 2 |
Автор: | seu [ Ср ноя 12, 2008 07:48 ] |
Заголовок сообщения: | Перенос строк в файле и SPF. |
Наткнулся на что-то странное. В архиве два файла, отличаются они друг от друга тем, что в одном перенос строк 0D0A (DOS-style), в другом 0A (UNIX-style). Один SPF обрабатывает, а другой нет. http://dump.ru/file/1205127 |
Автор: | chess [ Ср ноя 12, 2008 10:02 ] |
Заголовок сообщения: | |
seu писал(а): Наткнулся на что-то странное.
А что тут странного - один файл под win, другой под nix. С другой стороны есть СПФ под win и есть СПФ под nix. |
Автор: | ygrek [ Ср ноя 12, 2008 10:47 ] |
Заголовок сообщения: | |
https://sourceforge.net/tracker/index.p ... tid=367919 |
Автор: | seu [ Ср ноя 12, 2008 23:14 ] |
Заголовок сообщения: | |
chess Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33. Код: : IsDelimiter1 ( char -- flag ) Или это не так?
BL 1+ < ; VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiter |
Автор: | seu [ Ср ноя 12, 2008 23:28 ] |
Заголовок сообщения: | |
И вообще, какой смысл искать 0D0A и считать его за разделитель, когда можно искать и 0D, и 0A, и если находить их в паре, считать за два разделителя. Форту ведь всё равно, сколько их там будет. |
Автор: | mOleg [ Чт ноя 13, 2008 19:24 ] |
Заголовок сообщения: | |
seu писал(а): Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.
Код:: IsDelimiter1 ( char -- flag ) BL 1+ < ; VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiterИли это не так? Верно в СПФе так и есть, разделителем считается все, что имеет код 32 и меньше. Не знаю, как в стандарте (лень туда смотреть), так было не во всех фортах. Были и такие, в которых кодом разделителя был только пробел = 32, остальные символы включая ноль могли находиться в именах. Была даже такая шутка, как слово REFILL, код которого был = 0x0D0A. |
Автор: | chess [ Чт ноя 13, 2008 20:11 ] |
Заголовок сообщения: | |
seu писал(а): chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33. Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A (см. файл spf_win_io.f) |
Автор: | ygrek [ Пт ноя 14, 2008 23:53 ] |
Заголовок сообщения: | |
Файл обрабатывается как одна строка (т.к. разделитель не найден) и первый же комментарий до (остутствующего) конца строки "съедает" весь файл. Конец строки можно установить явно словами UNIX-LINES и DOS-LINES. Вообще, используйте решение приведённое в тикете (правда оно там не очень "правильное", но рабочее) |
Автор: | seu [ Вс ноя 16, 2008 06:08 ] |
Заголовок сообщения: | |
chess писал(а): seu писал(а): chess Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33. Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A (см. файл spf_win_io.f) |
Автор: | WingLion [ Вс ноя 16, 2008 08:16 ] |
Заголовок сообщения: | |
А при выводе файлов - программисту мудохаться с определением того, какая система, какой конец строки вписывать в конец? |
Автор: | seu [ Пн ноя 17, 2008 12:29 ] |
Заголовок сообщения: | |
WingLion Не совсем понял. А какие с этим проблемы? |
Автор: | WingLion [ Пн ноя 17, 2008 19:21 ] |
Заголовок сообщения: | |
В виндовсе в конец строки надо вписывать 0D0A, в юниксе - только 0D (или только 0A, не уверен, как правильно). А программе должно быть пофиг, где она работает, и вывод конца строки должен обрабатываться автоматом. Вывели строку, выводящее слово само добавило нужный конец строки, а не программисту об этом репу чесать. p.s. А у меня проблем нет... |
Автор: | mOleg [ Вт янв 26, 2010 18:44 ] |
Заголовок сообщения: | |
ээм, с проблемой разобрались уже. дело в том, что файл в СПФе грузится не целиком, а построчно, с помощью операции REFILL эта самая REFILL ищет последовательность 0x0D 0x0A и обрезает строку в буфере по эту последовательность. соответственно, если последовательность не встречается, а длина файла больше буфера, то на конце может воозникнуть ошибка, так как слово, находящееся на границе буфера будет разрезано. |
Автор: | in4 [ Ср янв 27, 2010 00:58 ] |
Заголовок сообщения: | |
А, кстати, как можно решить такие проблемы? Ведь, как я понимаю, такая же проблема будет если файл читать блоками (используя BLOCK) и строка или число попадет на границу? И при страничной организации (тоже через блоки) виртуальной памяти снова это же будет? Интересуют красивые решения. |
Автор: | вопрос [ Ср янв 27, 2010 01:25 ] |
Заголовок сообщения: | |
В начале файла обзательное слово о типе CR и без него вообоще файл не загружать впрочем, если учесть, что CR в одном типе состоит из одного символа, а в другом - из двух = можно определять автоматически |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |