Forth http://www.fforum.winglion.ru/ |
|
Добавить цифру в строку http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2839 |
Страница 1 из 3 |
Автор: | incubus370 [ Сб апр 14, 2012 13:58 ] |
Заголовок сообщения: | Добавить цифру в строку |
Нужно создавать файлы в цикле с именамим File-1.txt File-2.txt и т.д. Посему получается, что нужно в строку с именем файла добавить индекс цикла I. Как это можно сделать? |
Автор: | Hishnik [ Сб апр 14, 2012 14:11 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Строка - это массив символов. Символ нуля - 48 (0x30). Берем I 0x30 + и пишем это через C! в нужную позицию массива. |
Автор: | incubus370 [ Сб апр 14, 2012 14:34 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
В том то и дело что индекс массива больше 1 разряда? например I=88. Поэтому встает вопрос? как быть? например где лежит строка "File-" известно, то теперь нужно расширить память выделенную для этой строки, каким то образом организовать преобразование числа в строку, и добавить к строке. Затем к новой строке еще дополнительно добавить расширение ".txt" |
Автор: | WingLion [ Сб апр 14, 2012 14:53 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Начать с того, что строка с именем файла должна содержать file-XX.txt а затем в цикле писать в позиции XX нужные символы и использовать строку... Строку, разумеется надо в буфер положить, чтобы ее кто-нибудь не съел, пока она в воздухе болтается... Для двузначных номеров - можно либо два цикла вложенных использовать или прямо номер преобразовывать. Код: 100 0 DO I 10 / ->1st-symbol \ положить в позицию первого X I I 10 / 10 * - ->2nd-symbol \ положить в позицию второго X \ тут делать свои дела с именем файла LOOP ; А для односимвольных номеров сдвинуть .txt влево на одну позицию. |
Автор: | incubus370 [ Сб апр 14, 2012 15:08 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
WingLion писал(а): Начать с того, что строка с именем файла должна содержать file-XX.txt а затем в цикле писать в позиции XX нужные символы и использовать строку... Строку, разумеется надо в буфер положить, чтобы ее кто-нибудь не съел, пока она в воздухе болтается... Для двузначных номеров - можно либо два цикла вложенных использовать или прямо номер преобразовывать. Код: 100 0 DO I 10 / ->1st-symbol \ положить в позицию первого X I I 10 / 10 * - ->2nd-symbol \ положить в позицию второго X \ тут делать свои дела с именем файла LOOP ; А для односимвольных номеров сдвинуть .txt влево на одну позицию. Количество итераций этого цикла не заканчивается двумя разрядами, а может доходить до нескольких разрядов 3,4,5 и т.д. |
Автор: | Hishnik [ Сб апр 14, 2012 15:12 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
incubus370 писал(а): В том то и дело что индекс массива больше 1 разряда? например I=88. Поэтому встает вопрос? как быть? File-01, File-02... File-10.. File-99 |
Автор: | WingLion [ Сб апр 14, 2012 15:19 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
incubus370 писал(а): Количество итераций этого цикла не заканчивается двумя разрядами, а может доходить до нескольких разрядов 3,4,5 и т.д. Ох... жизнь не удалась... (с)... По аналогии трудно сделать? Или нужен ликбез по преобразованию чисел в десятичное представление? |
Автор: | incubus370 [ Сб апр 14, 2012 15:41 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Какое коичество файлов будет не известно. Все зависит от того когда пользователь прервет вычисления. Поэтому точно знать сколько разрядов будет увы не могу |
Автор: | Hishnik [ Сб апр 14, 2012 16:01 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Есть такой прием. В кварке EMIT - векторное слово. Печать числа использует EMIT. Делаем так Код: VARIABLE SYM-COUNTER CREATE NAME[] 256 ALLOT : EMIT-TO-NAME // пишем символ в буфер NAME[] SYM-COUNTER @ + C! 1 SYM-COUNTER +! ; FROM EMIT ' EMIT-TO-NAME TO EMIT 123 . TO EMIT Теперь 123 в виде символов окажется в массиве. |
Автор: | incubus370 [ Сб апр 14, 2012 16:24 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Хищник писал(а): Есть такой прием. В кварке EMIT - векторное слово. Печать числа использует EMIT. Делаем так Код: VARIABLE SYM-COUNTER CREATE NAME[] 256 ALLOT : EMIT-TO-NAME // пишем символ в буфер NAME[] SYM-COUNTER @ + C! 1 SYM-COUNTER +! ; FROM EMIT ' EMIT-TO-NAME TO EMIT 123 . TO EMIT Теперь 123 в виде символов окажется в массиве. кусочек кода Код: FROM EMIT ' EMIT-TO-NAME TO EMIT 123 . TO EMIT мне не совсем понятен? |
Автор: | Hishnik [ Сб апр 14, 2012 16:36 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
incubus370 писал(а): FROM EMIT Слово FROM позволяет прочитать текущее состояние векторного слова. incubus370 писал(а): TO EMIT Тут мы его восстанавливаем. incubus370 писал(а): ' EMIT-TO-NAME TO EMIT 123 . Назначаем наш обработчик на EMIT, и теперь 123 будет "печататься" в память, а не на экран. |
Автор: | incubus370 [ Сб апр 14, 2012 17:04 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Хищник писал(а): Есть такой прием. В кварке EMIT - векторное слово. Печать числа использует EMIT. Делаем так Код: VARIABLE SYM-COUNTER CREATE NAME[] 256 ALLOT : EMIT-TO-NAME // пишем символ в буфер NAME[] SYM-COUNTER @ + C! 1 SYM-COUNTER +! ; FROM EMIT ' EMIT-TO-NAME TO EMIT 123 . TO EMIT Теперь 123 в виде символов окажется в массиве. таким образом можно получить не только преобразование чисел в текст но и конкатенацию строк. сейчас попытаюсь это организовать |
Автор: | incubus370 [ Сб апр 14, 2012 17:59 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Почему конструкция Код: " .txt" 9 " File-" PRINT . PRINT на экран выводит File-9 .txt попробовав без пробела перед txt Код: ".txt" 9 " File-" PRINT . PRINT выдает ошибку. |
Автор: | Hishnik [ Сб апр 14, 2012 18:08 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
Переменная ?.SPACE отвечает за вывод пробела после числа. ?.SPACE OFF отключает пробел. По умолчанию оно включено. |
Автор: | incubus370 [ Сб апр 14, 2012 19:26 ] |
Заголовок сообщения: | Re: Добавить цифру в строку |
модифицировав код Хищника, получил код как для преобразования чисел встроку, так и для объединения строк Код: 0 ?.SPACE ! // отключаем пробел после чисел извлеченных со стека
VARIABLE STEP // переменная что будет пресутствовать в имени файла VARIABLE SYM-COUNTER CREATE FILENAME[] 256 ALLOT : EMIT-TO-NAME // пишем символ в буфер FILENAME[] SYM-COUNTER @ + C! 1 SYM-COUNTER +! ; FROM EMIT ' EMIT-TO-NAME TO EMIT // теперь весь вывод последовательно перенаправляется в буфер " File-" PRINT STEP @ . " .txt" PRINT //напечатать File- значение переменной Step (у нас по умолчанию 0) и .txt теперь FILENAME[] содержит следующую строку но без завершающего нуля "File-0.txt". TO EMIT FILENAME[] SYM-COUNTER @ + C! 0 помещаем в конце буфера 0 и заканчиваем строку. FILENAME[] NEWFILE CLOSE //создаем файл с именем File-0.txt и закрываем его |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |