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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: *разбиение файла на части
СообщениеДобавлено: Чт май 24, 2007 22:20 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Разбить очень большой текстовый файл на несколько маленьких. 

Необходимо получить из очень большого текстового файла набор маленьких,
с размером не превышающим указанный. Написать готовую программу break.exe,
получающую на входе в качестве параметров имя исходного файла, максимальный
размер куска, на который нужно разбить текст или число кусков, на которое
нужно разбить файл, а так же правило именования полученных кусков. Файл
можно разрывать только по целым строкам. В заголовке каждого созданного
файла должен быть указан порядковый номер части.

Ключи командной строки:
-h | /h | /? | -? | help или запуск программы без параметров
должны приводить к выводу подсказки по использованию программы.

-b n | -kb n | -mb n - указание на какого размера файлы разбить
исходный, соответственно число n - определяет количество
байт в случае ключа -b, количество килобайт в случае ключа -kb
и количество мегабайт в случае ключа -mb на которые необходимо
разбить исходный файл.

-n n - ключ -n определяет на какое количество файлов необходимо
разбить исходный текст. Данный ключ и ключи -b -kb -mb взаимоисключающи
и не могут встречаться в командной строке одновременно.

-f mask - именовать полученные файлы согласно указанным правилам.
после ключа f находится текстовый шаблон, согласно которому необходимо
нумеровать полученные части большого файла. mask может быть заключен
в кавычки, если содержит пробельные символы внутри.
Должны распознаваться следующие символы подстановки:
* - подставить содержимое поля вплоть до первой встреченной точки имени
исходного файла от текущей точки, то есть для файла abc.txt **
должна подставить в полученное имя следующий текст: abcabc, а для
маски 1.* - 1.txt ;
# - вставить разряд числа счетчика номера полученного файла, то есть
для файла abc.txt маска *###.txt должен привести к созданию следующих
имен файлов: abc001.txt abc002.txt и так далее;
? - вставить символ из текущей позиции исходного файла:
abc.txt при маске z?? должен сформировать такой текст: zbc
все остальные символы маски подставляются в текст без изменений. Точки
разделяют поля для символа *.

-s name - разбивать на меньшие указанный файл. Дополнительный ключ,
который может быть опущен, если имя файла находится в конце строки
параметров.

Любые дополнительные параметры в командной строке должны приводить к
выводу сообщения об ошибке, с предложением вывести информацию по
использованию программы (то есть с предложением запустить программу с
одним из ключей-подсказок). Если опция -f опущена, то файл именуется
следующим образом: name.####.*

По-умолчанию размер одной части = 64кб.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс май 27, 2007 13:44 
А что будет если в блоке нужного размера не окажется вообще ни одного переноса строки?.. Или этого не может быть, потому что не может быть никогда?

По здравому смыслу надо всё равно резать по размеру блока (так и делаю).


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 28, 2007 01:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
По здравому смыслу надо всё равно резать по размеру блока (так и делаю).


вообще, если подсовывается нетекстовый файл 8) это уже не проблема программы, что она не может найти переносы 8) Так что делаешь правильно! Соответственно, если размер кусочков, на которые файл режется короче длины строки - это тоже не проблема программы, а проблема того, кто такой параметр задал.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср май 30, 2007 21:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Мое решение.
Для сборки понадобится мой форк http://www.forth.org.ru/~mOleg/src4-mc5-b530.rar

\ 25-05-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ решение задачи с конкурса открытого на форуме
\ программа разбивающая большой текстовый файл на маленькие

\ компилировать двойное число на вершину кодофайла
: D, ( d --> ) HERE 2 CELLS ALLOT 2! ;

\ создать именованую переменную для хранения двойного числа
: dVar ( / name --> ) CREATE 0.0 D, DOES> ;

VARIABLE ResultFile# \ размер результирующего файла в байтах
VARIABLE parts \ количество частей, на которые надо разбить файл

\ преобразовать указанное число килобайт в кол-во байт
: kBytes ( u --> d ) 1024 * ;

\ преобразовать указанное число мегабайт в кол-во байт
: mBytes ( n --> d ) kBytes kBytes ;

64 kBytes ResultFile# ! \ предустановленный размер 64 кб

VECT ?waiting
: BYE ?waiting BYE ;

\ максимальный размер результирующего файла не может превышать 4G

VARIABLE b|n

\ уже введена подобная опция?
: ?alone ( --> )
b|n @ IF ." Must be only one spell: -n or -b\n\r" BYE
ELSE TRUE b|n !
THEN ;

\ преобразовать число
: ?numb ( / numb --> d )
0.0 NextWord >NUMBER IF ." \n\r Invaid number." BYE THEN DROP D>S ;

0 VALUE SourceFile \ имя исходного файла
0 VALUE FileMask \ маска
0 VALUE Prototype \ результат преобразования имени файла с помощью маски

\ сохранить строку в хипе, вернуть адрес начала
: SaveString ( asc # --> addr )
DUP CELL + ALLOCATE THROW
2DUP ! DUP >R CELL + SWAP CMOVE R> ;

\ по адресу строки получить ее начало и размер
: string> ( addr --> asc # ) DUP CELL + SWAP @ ;

\ откатить >IN назад, на начало непонятого слова
: <back ( ASC # --> ) DROP TIB - >IN ! ;

TRUE VALUE part-name-add \ добавлять ли имя части в начало файла

\ типа прогресс индикатор 8)
\ вобщем-то не обязательная вещь.
CREATE s-progress S" ·∙¤oO0Oo¤∙" S", VARIABLE iter
: ~progress ( --> )
s-progress COUNT iter @ SWAP MOD + C@ EMIT 0x08 EMIT
1 iter +! ;

\ -- ключи командной строки --------------------------------------------------

\ это на случай, если имя файла не предварено ключем -s
VOCABULARY expand
ALSO expand DEFINITIONS

\ пробуем строку распознать, как имя файла.
: NOTFOUND ( asc # --> )
OVER C@ [CHAR] " =
IF <back ParseFileName THEN

SeeForw NIP IF ." \n\rInvalid option: " TYPE BYE THEN
SourceFile IF ." \n\rSuperfluous parameter: " TYPE BYE THEN
SaveString TO SourceFile ;

RECENT

VOCABULARY COMMANDS
ALSO COMMANDS DEFINITIONS

\ подсказка - если встречается в командной строке - выполнение программы
\ прерывается, выводится помощь
: -h ( --> )
." \r command line options are:"
." \n\t -h & /h this help"
." \n\t /? & -? spell list"
." \n\t -b num result file size specificator"
." \n\t -f mask result files naming rules"
." \n\t -s file source file name"
." \n\t -n num result file count rules"
." \n\t -p don't write part name at start of file"
." \n\nSample: break.exe -n 10 -f *##.* [-s] FileName"
;
: /h ( --> ) -h ;

\ подсказка по ключам
: /? ( --> )
." \r spells are: "
GET-ORDER SWAP 5 VLIST SWAP nDROP BYE ;
: -? /? ;

\ указывает размер файлов, на который надо разбивать исходный
: -b ( / numb --> ) ?alone ?numb ResultFile# ! ;
: -kb ( / numb --> ) ?alone ?numb kBytes ResultFile# ! ;
: -mb ( / numb --> ) ?alone ?numb mBytes ResultFile# ! ;

\ на какое кол-во частей надо разбить исходный файл
: -n ( / numb --> ) ?alone ?numb parts ! ;

\ правило именования результирующих файлов
: -f ( / mask --> )
FileMask IF FileMask FREE DROP THEN \ повторение -f не запрещается
ParseFileName SaveString TO FileMask ;

\ имя исходного файла.
: -s ( / filename --> )
SourceFile IF SourceFile FREE DROP THEN \ повторение -s не запрещается
ParseFileName SaveString TO SourceFile ;

\ опция для отключения сохранения имен в начале каждой части
: -p ( --> ) 0 TO part-name-add ;

RECENT

\ -- формирование имен -------------------------------------------------------

\ пропустить все символы до разделительной точки включая точку
: skip-fld ( src # --> pos. )
0 >R BEGIN R@ OVER <> WHILE
OVER R@ + C@ [CHAR] . <> WHILE
char R+
REPEAT
THEN 2DROP R> ;

\ из строки src # взять все символы до символа '.' или до конца строки
: get-fld ( asc # --> pos ) OVER SWAP skip-fld TUCK KEEPS ;

\ варианты действия для символов подстановки
: onchar ( asc # pos char --> asc # pos )
[CHAR] ? OVER = IF DROP OVER MIN >R OVER R@ +
C@ KEEP R> char + EXIT
THEN
[CHAR] * OVER = IF DROP >R 2DUP get-fld R> + EXIT THEN
[CHAR] . OVER = IF KEEP DROP 2DUP skip-fld char + SKIPn 0 EXIT THEN
KEEP char + ;

\ сначала разбираемся с символами * ? - # игнорируем
: onward ( src # masc # --> res # )
OVER + SWAP 0 >R
<| BEGIN 2DUP <> WHILE \ пока не конец маски
DUP char + SWAP C@ >R
2SWAP 2R> onchar >R 2SWAP
REPEAT RDROP 2DROP 2DROP
|> ;

\ переместить строку во временное хранилище
: asc>temp ( asc # --> asc # ) TUCK char + TEMP SWAP CMOVE TEMP SWAP ;

\ подменить в строке src # все символы '#' на цифры числа u
\ результат положить во временный буфер адрес и длину результата вернуть
: partnum ( src # u --> res # )
>R asc>temp R> 0 0x0A {# # # # # # # # # # # #>
2OVER BEGIN DUP WHILE char -
2DUP + C@ [CHAR] # =
IF 2SWAP char - 2DUP + C@ >R
2SWAP 2DUP + R> SWAP C!
THEN
REPEAT 2DROP 2DROP
2DUP + 0 SWAP C! ;

\ ----------------------------------------------------------------------------

\ проверить наличие исходного файла
: ?source ( --> flag )
SourceFile DUP IFNOT ." \n\r source file missing." BYE THEN
string> FILE-EXIST ;

0 VALUE sourceId \ рукоядка исходного файла
dVar SourceFile# \ размер исходного файла

\ открыть исходный файл на чтение
: open-source ( --> )
?source IFNOT ." \n\rInvalid source file name: "
SourceFile string> ANSI>OEM TYPE BYE
THEN
SourceFile string> R/O OPEN-FILE
IF ." \n\r Can't open file." BYE THEN DUP TO sourceId
FILE-SIZE THROW SourceFile# 2! ;

\ сформировать имя результирующего файла
: outname ( --> )
SourceFile string> FileMask string>
onward SaveString TO Prototype ;

VARIABLE volume \ номер текущего тома
0 VALUE part# \ размер текущего сохраненного файла

\ создать новый том
: new-file ( --> handle )
volume DUP @ SWAP 1+!
Prototype string> ROT partnum
2DUP 2>R W/O CREATE-FILE THROW
part-name-add IF 2R@ DUP 2 CHARS + TO part#
ROT DUP >R WRITE-LINE THROW R>
ELSE 0 TO part#
THEN
2R> ." \r In progress: " ANSI>OEM TYPE ;

\ посчитать размер получаемого файла исходя из количества частей.
: measure ( --> )
SourceFile# 2@ parts @ UM/MOD + DUP 100 / +
ResultFile# ! ;

\ символ перевода строки ?
: ?eol ( addr --> flag ) C@ 0x0A = ;

\ найти последний перевод строки в буфере
: ScanBack ( start end --> addr TRUE|FALSE )
OVER UMAX
BEGIN 2DUP <> WHILE
DUP ?eol WHILENOT
char -
REPEAT NIP char + TRUE EXIT
THEN 2DROP FALSE ;

0 VALUE buffer \ адрес начала временного буфера
0 VALUE ^start \ адрес начала
0 VALUE ^end \ указатель на конец буфера

\ вернуть адрес и длину остатка содержимого входного буфера
: _rest> ( --> asc # ) ^start ^end OVER - ;

\ сбросить остаток содержимого буфера на диск
: save-rest ( dest-id --> )
>R _rest> TUCK
IF OVER R> WRITE-FILE THROW
ELSE R> 2DROP
THEN part# + TO part# ;

\ предельный размер буфера выше которого ему не стоит расти
\ в принципе можно выделять большой буфер, но ведь 3G буфер
\ всеравно не получится выделить...
100 kBytes CONSTANT buff-limit

\ заполнить входной буфер
: revive ( --> flag )
~progress
buffer DUP TO ^start ResultFile# @ buff-limit UMIN
sourceId READ-FILE THROW
DUP buffer + TO ^end ;

\ сохранить блок, ограниченный сверху символом перевода строки.
: save-block ( file-id --> )
>R ^start DUP ResultFile# @ part# - + char -
2DUP ScanBack IF NIP THEN TO ^start
^start OVER - R> WRITE-FILE THROW ;

\ сохранить данные в файл
: save-data ( dest-id --> flag )
ResultFile# @ _rest> NIP - 100 <
IF save-block TRUE EXIT THEN

BEGIN DUP save-rest revive WHILE
_rest> NIP part# + ResultFile# @ < WHILE
REPEAT save-block TRUE EXIT
THEN save-rest FALSE ;

\ создать буффер для промежуточного хранения данных файла
: arise ( # --> addr )
ResultFile# @ buff-limit UMIN
ALLOCATE THROW ;

\ основной цикл программы
: PROCESS-FILES ( --> )
open-source
parts @ IF measure THEN
outname 1 volume !
arise TO buffer
BEGIN new-file DUP >R save-data WHILE
R> CLOSE-FILE DROP
REPEAT R> CLOSE-FILE
buffer FREE DROP
sourceId CLOSE-FILE DROP ;

\ инициализация опций командной строки
: init ( --> )
cmdline> COMMANDS SEAL ALSO expand UNDER
S" name.####.*" SaveString TO FileMask
SOURCE DROP C@ [CHAR] " = IF ['] KEY IS ?waiting THEN
;

\ главное слово
: break ( --> )
init SeeForw NIP
IFNOT [ ALSO COMMANDS ] -h [ PREVIOUS ]
ELSE ['] INTERPRET CATCH
IF ." .\n\rInternal error."
ELSE ['] PROCESS-FILES CATCH DROP
THEN
THEN BYE ;

\ -- сохранение в файл -------------------------------------------------------

' break MAINX !

S" break.exe" SAVE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 02, 2007 01:45 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
То же самое для СПФ4.18
для сборки придется залить с CVS последние обновления..

\ 25-05-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ решение задачи с конкурса открытого на форуме
\ программа разбивающая большой текстовый файл на маленькие

REQUIRE ?DEFINED devel\~moleg\lib\util\ifdef.f
REQUIRE s" devel\~moleg\lib\strings\string.f
REQUIRE onward devel\~moleg\lib\strings\subst.f

\ установить SOURCE на строку параметров √
: cmdline> ( --> )
-1 TO SOURCE-ID
GetCommandLineA ASCIIZ> SOURCE!
ParseFileName 2DROP ;

\ компилировать двойное число на вершину кодофайла
: D, ( d --> ) HERE 2 CELLS ALLOT 2! ;

\ создать именованую переменную для хранения двойного числа
: dVar ( / name --> ) CREATE 0 0 D, DOES> ;

VARIABLE ResultFile# \ размер результирующего файла в байтах
VARIABLE parts \ количество частей, на которые надо разбить файл

\ преобразовать указанное число килобайт в кол-во байт
: kBytes ( u --> d ) 1024 * ;

\ преобразовать указанное число мегабайт в кол-во байт
: mBytes ( n --> d ) kBytes kBytes ;

64 kBytes ResultFile# ! \ предустановленный размер 64 кб

VECT ?waiting
: BYE ?waiting BYE ;

\ максимальный размер результирующего файла не может превышать 4G

VARIABLE b|n

\ уже введена подобная опция?
: ?alone ( --> )
b|n @ IF ." Must be only one spell: -n or -b\n\r" BYE
ELSE TRUE b|n !
THEN ;

\ преобразовать число
: ?numb ( / numb --> d )
0 0 NextWord >NUMBER IF ." \n\r Invaid number." BYE THEN DROP D>S ;

0 VALUE SourceFile \ имя исходного файла
0 VALUE FileMask \ маска
0 VALUE Prototype \ результат преобразования имени файла с помощью маски

\ сохранить строку в хипе, вернуть адрес начала
: SaveString ( asc # --> addr )
DUP CELL + char + ALLOCATE THROW
2DUP ! DUP >R CELL + SWAP 2DUP 2>R CMOVE 2R> + 0 SWAP C! R> ;

\ по адресу строки получить ее начало и размер
: string> ( addr --> asc # ) DUP CELL + SWAP @ ;

\ откатить >IN назад, на начало непонятого слова
: <back ( ASC # --> ) DROP TIB - >IN ! ;

TRUE VALUE part-name-add \ добавлять ли имя части в начало файла

\ типа прогресс индикатор 8)
\ вобщем-то не обязательная вещь.
CREATE s-progress S" ·∙¤oO0Oo¤∙" S", VARIABLE iter
: ~progress ( --> )
s-progress COUNT iter @ SWAP MOD + C@ EMIT 0x08 EMIT
1 iter +! ;

\ -- ключи командной строки --------------------------------------------------

\ это на случай, если имя файла не предварено ключем -s
VOCABULARY expand
ALSO expand DEFINITIONS

\ пробуем строку распознать, как имя файла.
: NOTFOUND ( asc # --> )
OVER C@ [CHAR] " =
IF <back ParseFileName THEN

SeeForw NIP IF ." \n\rInvalid option: " TYPE BYE THEN
SourceFile IF ." \n\rSuperfluous parameter: " TYPE BYE THEN
SaveString TO SourceFile ;

RECENT

VOCABULARY COMMANDS
ALSO COMMANDS DEFINITIONS

\ подсказка - если встречается в командной строке - выполнение программы
\ прерывается, выводится помощь
: -h ( --> )
." \r command line options are:"
." \n\t -h & /h this help"
." \n\t /? & -? spell list"
." \n\t -b num result file size specificator"
." \n\t -f mask result files naming rules"
." \n\t -s file source file name"
." \n\t -n num result file count rules"
." \n\t -p don't write part name at start of file"
." \n\nSample: break.exe -n 10 -f *##.* [-s] FileName"
;
: /h ( --> ) -h ;

\ подсказка по ключам
: /? ( --> )
." \r spells are: "
GET-ORDER SWAP NLIST BYE ;
: -? /? ;

\ указывает размер файлов, на который надо разбивать исходный
: -b ( / numb --> ) ?alone ?numb ResultFile# ! ;
: -kb ( / numb --> ) ?alone ?numb kBytes ResultFile# ! ;
: -mb ( / numb --> ) ?alone ?numb mBytes ResultFile# ! ;

\ на какое кол-во частей надо разбить исходный файл
: -n ( / numb --> ) ?alone ?numb parts ! ;

\ правило именования результирующих файлов
: -f ( / mask --> )
FileMask IF FileMask FREE DROP THEN \ повторение -f не запрещается
ParseFileName SaveString TO FileMask ;

\ имя исходного файла.
: -s ( / filename --> )
SourceFile IF SourceFile FREE DROP THEN \ повторение -s не запрещается
ParseFileName SaveString TO SourceFile ;

\ опция для отключения сохранения имен в начале каждой части
: -p ( --> ) 0 TO part-name-add ;

RECENT

\ ----------------------------------------------------------------------------

\ проверить наличие исходного файла
: ?source ( --> flag )
SourceFile DUP IFNOT ." \n\r source file missing." BYE THEN
string> FILE-EXIST ;

0 VALUE sourceId \ рукоядка исходного файла
dVar SourceFile# \ размер исходного файла

\ открыть исходный файл на чтение
: open-source ( --> )
?source IFNOT ." \n\rInvalid source file name: "
SourceFile string> ANSI>OEM TYPE BYE
THEN
SourceFile string> R/O OPEN-FILE
IF ." \n\r Can't open file." BYE THEN DUP TO sourceId
FILE-SIZE THROW SourceFile# 2! ;

\ сформировать имя результирующего файла
: outname ( --> )
SourceFile string> FileMask string>
onward SaveString TO Prototype ;

VARIABLE volume \ номер текущего тома
0 VALUE part# \ размер текущего сохраненного файла

\ создать новый том
: new-file ( --> handle )
volume DUP @ SWAP 1+!
Prototype string> ROT partnum
2DUP 2>R W/O CREATE-FILE THROW
part-name-add IF 2R@ DUP 2 CHARS + TO part#
ROT DUP >R WRITE-LINE THROW R>
ELSE 0 TO part#
THEN
2R> ." \r In progress: " ANSI>OEM TYPE ;

\ посчитать размер получаемого файла исходя из количества частей.
: measure ( --> )
SourceFile# 2@ parts @ UM/MOD + DUP 100 / +
ResultFile# ! ;

\ символ перевода строки ?
: ?eol ( addr --> flag ) C@ 0x0A = ;

\ найти последний перевод строки в буфере
: ScanBack ( start end --> addr TRUE|FALSE )
OVER UMAX
BEGIN 2DUP <> WHILE
DUP ?eol WHILENOT
char -
REPEAT NIP char + TRUE EXIT
THEN 2DROP FALSE ;

0 VALUE buffer \ адрес начала временного буфера
0 VALUE ^start \ адрес начала
0 VALUE ^end \ указатель на конец буфера

\ вернуть адрес и длину остатка содержимого входного буфера
: _rest> ( --> asc # ) ^start ^end OVER - ;

\ сбросить остаток содержимого буфера на диск
: save-rest ( dest-id --> )
>R _rest> TUCK
IF OVER R> WRITE-FILE THROW
ELSE R> 2DROP
THEN part# + TO part# ;

\ предельный размер буфера выше которого ему не стоит расти
\ в принципе можно выделять большой буфер, но ведь 3G буфер
\ всеравно не получится выделить...
100 kBytes CONSTANT buff-limit

\ заполнить входной буфер
: revive ( --> flag )
~progress
buffer DUP TO ^start ResultFile# @ buff-limit UMIN
sourceId READ-FILE THROW
DUP buffer + TO ^end ;

\ сохранить блок, ограниченный сверху символом перевода строки.
: save-block ( file-id --> )
>R ^start DUP ResultFile# @ part# - + char -
2DUP ScanBack IF NIP THEN TO ^start
^start OVER - R> WRITE-FILE THROW ;

\ сохранить данные в файл
: save-data ( dest-id --> flag )
ResultFile# @ _rest> NIP - 100 <
IF save-block TRUE EXIT THEN

BEGIN DUP save-rest revive WHILE
_rest> NIP part# + ResultFile# @ < WHILE
REPEAT save-block TRUE EXIT
THEN save-rest FALSE ;

\ создать буффер для промежуточного хранения данных файла
: arise ( # --> addr )
ResultFile# @ buff-limit UMIN
ALLOCATE THROW ;

\ основной цикл программы
: PROCESS-FILES ( --> )
open-source
parts @ IF measure THEN
outname 1 volume !
arise TO buffer
BEGIN new-file DUP >R save-data WHILE
R> CLOSE-FILE DROP
REPEAT R> CLOSE-FILE
buffer FREE DROP
sourceId CLOSE-FILE DROP ;

\ инициализация опций командной строки
: init ( --> )
cmdline> COMMANDS SEAL ALSO expand UNDER
S" name.####.*" SaveString TO FileMask
SOURCE DROP C@ [CHAR] " = IF ['] KEY TO ?waiting THEN
;

\ главное слово
: break ( --> )
init SeeForw NIP
IFNOT [ ALSO COMMANDS ] -h [ PREVIOUS ]
ELSE ['] INTERPRET CATCH
IF ." .\n\rInternal error."
ELSE ['] PROCESS-FILES CATCH DROP
THEN
THEN BYE ;

\ -- сохранение в файл -------------------------------------------------------

' break MAINX !

S" break.exe" SAVE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 13, 2007 18:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
"в заголовке каждого созданного файла должен быть указан порядковый номер части..." -- в смысле "каждого"?.. А если в маске нет диеза (решётки)?

значит файл будет многократно переписан. И в конце концов в нем окажется последняя часть.
Собственно, тут вполне нормально полагаться на усмотрение решающего 8)

profiT писал(а):
"подставить содержимое поля вплодь до первой встреченой точки имени исходного файла от текущей точки..." -- только на примерах и можно худо-худо, бедно-бедно как-то стелепатировать и вычленить смысл из этих буквокомбинаций.

8)

profiT писал(а):
"Любые дополнительные параметры в командной строке должны приводить к выводу сообщения об ошибке, с предложением вывести информацию по использованию программы"
А что должно выводится например в случае: "break.exe -h ля-ля-тополя" или в случае "break.exe -n 3 -s file.txt ля-ля-тополя"?..

ну, если запрашивается помощь, то остальные параметры левые.
И вообще все заданные тобой вопросы относятся к области детализации задачи, и могут быть тобой же и решены 8) То есть оставлены на усмотрение решающего, те же, например ""


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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