Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
Можно и мелкими блоками читать, просто фиксировать, когда конец строки достигнут при чтении, а когда нет. Если нет, следующую считанную порцию приклеивать к остатку предыдущей.
А остатком считать "слово, которое закончилось не пробелом, концом буфера" (если на конце был пробел - остаток - пустая строка)
Можно и мелкими блоками читать, просто фиксировать, когда конец строки достигнут при чтении, а когда нет. Если нет, следующую считанную порцию приклеивать к остатку предыдущей.
А остатком считать "слово, которое закончилось не пробелом, концом буфера" (если на конце был пробел - остаток - пустая строка)
|
|
|
|
Добавлено: Ср янв 27, 2010 19:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
in4 писал(а): А, кстати, как можно решить такие проблемы?
во-первых, можно искать только один символ 0x0D а не последовательность из двух.
во-вторых, можно грузить в память файл целиком (памяти для этого сейчас хватает) ограничение, слишком большие файлы не будут загружаться (слишком большие, это больше ~1.5GB на файл)
можно совместить решения, большие файлы читать построчно (или поблочно) а маленькие целиком (так сделано в форке)
[quote="in4"]А, кстати, как можно решить такие проблемы?[/quote]
во-первых, можно искать только один символ 0x0D а не последовательность из двух.
во-вторых, можно грузить в память файл целиком (памяти для этого сейчас хватает) ограничение, слишком большие файлы не будут загружаться (слишком большие, это больше ~1.5GB на файл)
можно совместить решения, большие файлы читать построчно (или поблочно) а маленькие целиком (так сделано в форке)
|
|
|
|
Добавлено: Ср янв 27, 2010 13:17 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
В начале файла обзательное слово о типе CR и без него вообоще файл не загружать
впрочем, если учесть, что CR в одном типе состоит из одного символа, а в другом - из двух = можно определять автоматически
В начале файла обзательное слово о типе CR и без него вообоще файл не загружать
впрочем, если учесть, что CR в одном типе состоит из одного символа, а в другом - из двух = можно определять автоматически
|
|
|
|
Добавлено: Ср янв 27, 2010 01:25 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А, кстати, как можно решить такие проблемы?
Ведь, как я понимаю, такая же проблема будет если файл читать блоками (используя BLOCK) и строка или число попадет на границу?
И при страничной организации (тоже через блоки) виртуальной памяти снова это же будет?
Интересуют красивые решения.
А, кстати, как можно решить такие проблемы?
Ведь, как я понимаю, такая же проблема будет если файл читать блоками (используя BLOCK) и строка или число попадет на границу?
И при страничной организации (тоже через блоки) виртуальной памяти снова это же будет?
Интересуют красивые решения. ;)
|
|
|
|
Добавлено: Ср янв 27, 2010 00:58 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
ээм, с проблемой разобрались уже.
дело в том, что файл в СПФе грузится не целиком, а построчно, с помощью операции REFILL
эта самая REFILL ищет последовательность 0x0D 0x0A и обрезает строку в буфере по эту последовательность.
соответственно, если последовательность не встречается, а длина файла больше буфера, то на конце может воозникнуть ошибка, так как слово, находящееся на границе буфера будет разрезано.
ээм, с проблемой разобрались уже.
дело в том, что файл в СПФе грузится не целиком, а построчно, с помощью операции REFILL
эта самая REFILL ищет последовательность 0x0D 0x0A и обрезает строку в буфере по эту последовательность.
соответственно, если последовательность не встречается, а длина файла больше буфера, то на конце может воозникнуть ошибка, так как слово, находящееся на границе буфера будет разрезано.
|
|
|
|
Добавлено: Вт янв 26, 2010 18:44 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
В виндовсе в конец строки надо вписывать 0D0A, в юниксе - только 0D (или только 0A, не уверен, как правильно).
А программе должно быть пофиг, где она работает, и вывод конца строки должен обрабатываться автоматом.
Вывели строку, выводящее слово само добавило нужный конец строки, а не программисту об этом репу чесать.
p.s. А у меня проблем нет...
В виндовсе в конец строки надо вписывать 0D0A, в юниксе - только 0D (или только 0A, не уверен, как правильно).
А программе должно быть пофиг, где она работает, и вывод конца строки должен обрабатываться автоматом.
Вывели строку, выводящее слово само добавило нужный конец строки, а не программисту об этом репу чесать.
p.s. А у меня проблем нет...
|
|
|
|
Добавлено: Пн ноя 17, 2008 19:21 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
WingLion
Не совсем понял. А какие с этим проблемы?
[b]WingLion[/b]
Не совсем понял. А какие с этим проблемы?
|
|
|
|
Добавлено: Пн ноя 17, 2008 12:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А при выводе файлов - программисту мудохаться с определением того, какая система, какой конец строки вписывать в конец?
А при выводе файлов - программисту мудохаться с определением того, какая система, какой конец строки вписывать в конец?
|
|
|
|
Добавлено: Вс ноя 16, 2008 08:16 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
chess писал(а): seu писал(а): chess Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33. Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A (см. файл spf_win_io.f) Ну я и спрашиваю, почему бы не определить концом строки и 0D, и 0A. Ну, будет пустая строка, но Форту-то всё равно. Зато работать будет со всеми файлами без всяких UNIX-LINES и DOS-LINES.
[quote="chess"][quote="seu"]chess Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.[/quote] Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A (см. файл spf_win_io.f)[/quote]Ну я и спрашиваю, почему бы не определить концом строки и 0D, и 0A. Ну, будет пустая строка, но Форту-то всё равно. Зато работать будет со всеми файлами без всяких UNIX-LINES и DOS-LINES.
|
|
|
|
Добавлено: Вс ноя 16, 2008 06:08 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Файл обрабатывается как одна строка (т.к. разделитель не найден) и первый же комментарий до (остутствующего) конца строки "съедает" весь файл.
Конец строки можно установить явно словами UNIX-LINES и DOS-LINES.
Вообще, используйте решение приведённое в тикете (правда оно там не очень "правильное", но рабочее)
Файл обрабатывается как одна строка (т.к. разделитель не найден) и первый же комментарий до (остутствующего) конца строки "съедает" весь файл.
Конец строки можно установить явно словами UNIX-LINES и DOS-LINES.
Вообще, используйте решение приведённое в тикете (правда оно там не очень "правильное", но рабочее)
|
|
|
|
Добавлено: Пт ноя 14, 2008 23:53 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
seu писал(а): chess Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.
Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A
(см. файл spf_win_io.f)
[quote="seu"]chess Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.[/quote]
Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 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.
[quote="seu"]Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33. Код:: IsDelimiter1 ( char -- flag ) BL 1+ < ; VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiterИли это не так?[/quote]
Верно в СПФе так и есть, разделителем считается все, что имеет код 32 и меньше. Не знаю, как в стандарте (лень туда смотреть), так было не во всех фортах. Были и такие, в которых кодом разделителя был только пробел = 32, остальные символы включая ноль могли находиться в именах. Была даже такая шутка, как слово REFILL, код которого был = 0x0D0A.
|
|
|
|
Добавлено: Чт ноя 13, 2008 19:24 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
И вообще, какой смысл искать 0D0A и считать его за разделитель, когда можно искать и 0D, и 0A, и если находить их в паре, считать за два разделителя. Форту ведь всё равно, сколько их там будет.
И вообще, какой смысл искать 0D0A и считать его за разделитель, когда можно искать и 0D, и 0A, и если находить их в паре, считать за два разделителя. Форту ведь всё равно, сколько их там будет.
|
|
|
|
Добавлено: Ср ноя 12, 2008 23:28 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33. Код: : IsDelimiter1 ( char -- flag ) BL 1+ < ; VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiter Или это не так?
[b]chess[/b]
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.[code]: IsDelimiter1 ( char -- flag ) BL 1+ < ; VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiter[/code]Или это не так?
|
|
|
|
Добавлено: Ср ноя 12, 2008 23:14 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
https://sourceforge.net/tracker/index.php?func=detail&aid=1691831&group_id=17919&atid=367919
|
|
|
|
Добавлено: Ср ноя 12, 2008 10:47 |
|
|
|
|