powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите "халявщику" в Foxpro for DOS
10 сообщений из 10, страница 1 из 1
Помогите "халявщику" в Foxpro for DOS
    #35095958
SSSQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All!

Помогите "халявщику" в Foxpro для DOS, например 2,6!!!!!!!
Задача: есть текстовый файл, который на рулоне распечатывается на матричном принтере, потом режется на куски. Необходимо средствами Fox организовать его печать на лазерном - полистовом принтере, таким образом, чтобы не разбивалась информативность.
Алгоритм примерно такой - открываем файл на низком уровне, отсчитываем строки, доходим до 60-й и проверяем не начинается ли она с символа '+' (пускай это будет символ, по которому можно было ранее разрезать отпечатанный рулон на матричнике), если да, то вставляем в файл символ прогона листа и идем ДАЛЬШЕ, если нет, то идем в обратную сторону, пока не дойдем до данного символа и вставляем символ прогона листа. ДАЛЬШЕ - счетчик строки становится опять единица и идем до след. 60-й строки и т.д. до конца файла.
Кто поможет, набросать кусок текста, так как совсем не понимаю, как работают функции fopen() и т.д., особенно fwrite() - никуда не записывает ;(. Может надо результат в другой файл записывать?
Не дайте пропасть, и с надеждой на помощь.

С уважением.
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35096216
SSSQHi All!

Помогите "халявщику" в Foxpro для DOS, например 2,6!!!!!!!
Задача: есть текстовый файл, который на рулоне распечатывается на матричном принтере, потом режется на куски. Необходимо средствами Fox организовать его печать на лазерном - полистовом принтере, таким образом, чтобы не разбивалась информативность.
Алгоритм примерно такой - открываем файл на низком уровне, отсчитываем строки, доходим до 60-й и проверяем не начинается ли она с символа '+' (пускай это будет символ, по которому можно было ранее разрезать отпечатанный рулон на матричнике), если да, то вставляем в файл символ прогона листа и идем ДАЛЬШЕ, если нет, то идем в обратную сторону, пока не дойдем до данного символа и вставляем символ прогона листа. ДАЛЬШЕ - счетчик строки становится опять единица и идем до след. 60-й строки и т.д. до конца файла.
Кто поможет, набросать кусок текста, так как совсем не понимаю, как работают функции fopen() и т.д., особенно fwrite() - никуда не записывает ;(. Может надо результат в другой файл записывать?
Не дайте пропасть, и с надеждой на помощь.

С уважением.
Если ты работал на С++ под ДОС, то эти функции - прямые аналоги Си-шных (вплоть до числа и порядка следования параметров).
Смысл этих функций следующий:
- открывается (fopen()) или создается (fcreate()) файл на диске. Чтобы система могла с ним работать, ему назначается некоторый идентификатор (хэндл, handle), который принадлежит только этому файлу и только до его закрытия.
- по данному идентификатору происходит обращение к файлу на чтение (fread(), fgets()) и запись (fwrite(), fputs()). Разница между fread() и fgets() заключается в том, что fread() читает заданное число байт или до конца строки, а fgets() - только до конца строки; разница между fwrite() и fputs() заключается в том, что fwrite() записывает заданное число байт без модификации строки, а fputs() - к строке добавляет символы перевода строки и возврата каретки.
- fseek() производит перемещение по файлу, fpos() - сообщает о текущей позиции указателя
- fclose() - закрывает файл, освобождает его идентификатор (хэндл) и освобождает системные ресурсы, связанные с файлом.
Проще всего представить работу с файлом на низком уровне как работу с магнитной лентой. Тогда положение указателя = положение головки чтения-записи относительно начала ленты...
В этом случае вставка символа в какую либо позицию приведет к модификации оставшейся части файла, т.е. будут удален один из следующих за ним символов...
Алгоритм здесь будет следующим:
- считать информацию до требуемого места во вспомогательный файл;
- вставить во вспомогательный файл необходимымй фрагмент;
- скопировать во вспомогательный файл остаток исходного файла / или очередной кусок данных;
- закрыть оба файла;

Успехов.
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35096345
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
особенно fwrite() - никуда не записывает ;(.
А посмотреть и поставить правильный режим работы с файлом в функциях fcreate()/fopen() религия не позволяет?
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35097587
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSSQHi All!

Задача: есть текстовый файл, который на рулоне распечатывается на матричном принтере, потом режется на куски. Необходимо средствами Fox организовать его печать на лазерном - полистовом принтере, таким образом, чтобы не разбивалась информативность.
Алгоритм примерно такой - открываем файл на низком уровне, отсчитываем строки, доходим до 60-й и проверяем не начинается ли она с символа '+' (пускай это будет символ, по которому можно было ранее разрезать отпечатанный рулон на матричнике), если да, то вставляем в файл символ прогона листа и идем ДАЛЬШЕ, если нет, то идем в обратную сторону, пока не дойдем до данного символа и вставляем символ прогона листа. ДАЛЬШЕ - счетчик строки становится опять единица и идем до след. 60-й строки и т.д. до конца файла.
Кто поможет, набросать кусок текста, так как совсем не понимаю, как работают функции fopen() и т.д., особенно fwrite() - никуда не записывает ;(. Может надо результат в другой файл записывать?
Не дайте пропасть, и с надеждой на помощь.

С уважением.

_max_dlina=8 && число строк на листе

_file1="test.txt" && исходный и выходной файлы
_file2="test.out"

fi=fopen(_file1)
fo=FCREATE(_file2)
i=0
_str=""
do while !feof(fi)
_str=fgets(fi)
i=i+1
if left(_str,1)="+"
_str=chr(12) && всместо строки с "+" пишем перевод страницы
=fputs(fo,_str)
i=0
else
=fputs(fo,_str)
if i=_max_dlina
=fputs(fo,chr(12))
i=0
endif
endif
enddo
if left(_str,1)!="+" and i!=_max_dlina
=fputs(fo,chr(12))
endif
=fclose(fi)
=fclose(fo)
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35097996
SSSQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемы s_gonch!

Тысяча благодарностей за ваш код. Однако чуть-чуть не то. Ниже объясню:

_max_dlina=8 && число строк на листе

_file1="test.txt" && исходный и выходной файлы
_file2="test.out"

fi=fopen(_file1)
fo=FCREATE(_file2)
i=0
_str=""
do while !feof(fi)
_str=fgets(fi)
i=i+1
if left(_str,1)="+"
_str=chr(12) && всместо строки с "+" пишем перевод страницы
=fputs(fo,_str)
i=0
else
=fputs(fo,_str)
if i=_max_dlina

А вот здесь надо идти вверх назад по файлу и искать последний "+" и на него ставить chr(12).
И с него опять вниз начинать отсчет i=0. А как ?

=fputs(fo,chr(12))
i=0
endif
endif
enddo
if left(_str,1)!="+" and i!=_max_dlina
=fputs(fo,chr(12))
endif
=fclose(fi)
=fclose(fo)

С уважением.
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35099215
SSSQHi All!

Помогите "халявщику" в Foxpro для DOS, например 2,6!!!!!!!
Задача: есть текстовый файл, который на рулоне распечатывается на матричном принтере, потом режется на куски. Необходимо средствами Fox организовать его печать на лазерном - полистовом принтере, таким образом, чтобы не разбивалась информативность.
Алгоритм примерно такой - открываем файл на низком уровне, отсчитываем строки, доходим до 60-й и проверяем не начинается ли она с символа '+' (пускай это будет символ, по которому можно было ранее разрезать отпечатанный рулон на матричнике), если да, то вставляем в файл символ прогона листа и идем ДАЛЬШЕ, если нет, то идем в обратную сторону, пока не дойдем до данного символа и вставляем символ прогона листа. ДАЛЬШЕ - счетчик строки становится опять единица и идем до след. 60-й строки и т.д. до конца файла.
Кто поможет, набросать кусок текста, так как совсем не понимаю, как работают функции fopen() и т.д., особенно fwrite() - никуда не записывает ;(. Может надо результат в другой файл записывать?
Не дайте пропасть, и с надеждой на помощь.

С уважением.
Что-то я не понял Вашего алгоритма (перепишу его в алгоритмическом виде с урезанием некоторых деталей):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Открыть файл;
переменная Счетчик =  0 ;
пока (не достигут конец файла) делать
    считать строку;
    счетчик = счетчик +  1 ;
    если1 ( счетчик = число строк на странице и первый символ = "+") делать
      вставить прогон листа;
      счетчик =  0 ;
    иначе
       если2 ( счетчик = число строк на странице и первый символ <> "+") делать
           пока (счетчик != 0  или первый символ <> "+") делать
                счетчик = счетчик -  1 ;
                если3 (первый символ равен "+") делать
                    вставить прогон страницы вместо строки;
                    счетчик =  0 ;
                    выйти из цикла;
                 конец если3; 
           конец пока;
       конец если2;
    конец если1;
конец пока;
Таким образом получаем много ненужных перемещений по файлу/памяти. Такой алгоритм трудно отлаживать и легко получить кучу ошибок.

Предложенный s_gonch алгоритм (перепишу его в алгоритмическом виде с урезанием некоторых деталей):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Открыть файл;
переменная Счетчик =  0 ;
пока (не достигут конец файла) делать
    считать строку;
    счетчик = счетчик +  1 ;
    если (первый символ равен "+" или счетчик = число строк на странице) делать
      вставить прогон страницы;
      счетчик =  0 ;
    конец если; 
конец пока;
Алгоритм делает все то же самое, что и Ваш. Но: здесь уже все намного проще и ошибок сделать намного труднее

P.S.: Не пытайтесь сразу отвергнуть, а попытайтесь понять...
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35099496
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, SSSQ хотел чуть другую вещь.
Я понял так. Пусть файл такой структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 1. + строка уровня 1 блок 1
 2. - строка уровня 2 блок 1
 3. + строка уровня 1 блок 2
 4. - строка уровня 2 блок 2
 5. - строка уровня 2 блок 2
 6. - строка уровня 2 блок 2
 7. + строка уровня 1 блок 3
 8. - строка уровня 2 блок 3
 9. - строка уровня 2 блок 3
10. + строка уровня 1 блок 4
11. - строка уровня 2 блок 4
Теперь представим, что на листе всего 10 строк помещается. Если отсчитать ровно 10 строк и вставить chr(12), то блок 4 разорвется между страницами 1 и 2. А SSSQ хочет сделать так, чтобы выбрать сначала 10 строк с прошлого переноса на новую строку - максимум на листе - а потом искать первую строку снизу, начинающуюся символом "+", в этом блоке - и вот перед ней chr(12) поставить (в конце предыдущей).
Этот алгоритм можно реализовать в один проход.
Установить счетчик строк i в 0. Открыть файл in. Создать пока пустой файл out.
Читать файл in построчно (учитывая возможность переноса строки при превышении символов в ней над колонками на странице, либо перенося на новую строку, либо обрезая хвосты длинных строк). Новую строку сохранить в переменную z. Пока не достигнуты условия переноса на следующую страницу, увеличивать счетчик i на 1.
Если первый символ в новой строке = "+" и количество строк на странице меньше максимума, присвоить переменной j значение 1. Добавить значение переменной y к x. Присвоить значение переменной z переменной y. Иначе переменную j увеличить на 1, а значение переменной z добавить к y.
Если i превысил максимальное количество строк на листе, то сбросить значение переменной x в файл out, дописав в конец символ прогона листа. после чего переменной х присвоить пустое значение, а переменной i присвоить значение j, так как в переменной y уже находится j строк, которые будут уже на новой странице.
Надо еще разрулить ситуацию, когда строк второго уровня больше чем строк на листе. Или в этом случае печатать не будем? ;-)
________
Не дадим распространиться заразе политкорректности!
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35099507
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: и последнюю страницу к файлу out не забыть приписать, когда файл in кончится ;-)
PPS: и файлы закрыть
________
Не дадим распространиться заразе политкорректности!
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35099994
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSSQУважаемы s_gonch!

Тысяча благодарностей за ваш код. Однако чуть-чуть не то.


Видимо, так подойдет больше.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
_max_list= 9     && число строк на листе
dimension buf[_max_list]

_file1="test.txt"
_file2="test.out"
fi=fopen(_file1)
fo=FCREATE(_file2)
i= 0 
n= 0 
pos= 0 
_str=""

do while !feof(fi)
   _str=fgets(fi)
    i=i+ 1 
    buf[i]=_str
    if left(_str, 1 )="+"
        pos=fseek(fi, 0 , 1 )       && текущая позиция в файле
        n=i                     && номер строки в буфере
    endif
    if i=_max_list
        if n= 0 
* если строк уже набралось много, а + все нет
            n=_max_list
        else
* вернемся к строке, следующей за последним "+"
       	=fseek(fi,pos, 0 )
        endif
        for i= 1  to n
	=fputs(fo,buf[i])
        endfor
        =fputs(fo,chr( 12 ))
        i= 0 
        n= 0 
   endif
enddo
* сбросим остаток
if i> 0 
    n=i
    for i= 1  to n
    	=fputs(fo,buf[i])
    endfor
endif
=fputs(fo,chr( 12 ))
=fclose(fi)
=fclose(fo)
Однако здесь некоторые строки из файла читаются дважды, неспортивно как-то ...
Можно попробовать иначе, не дергать указатель файла вообще.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
_max_list= 9     && число строк на листе

dimension buf[_max_list]

_file1="test.txt"
_file2="test.out"
fi=fopen(_file1)
if fi< 0 
	wait window "Не могу открыть файл "+_file1 timeout  2 
	quit
endif
fo=FCREATE(_file2)
if fi< 0 
	wait window "Не могу создать файл "+_file2 timeout  2 
	quit
endif

i= 0 
n= 0 
kol= 0 	
_str=""

do while !feof(fi)
    _str=fgets(fi)
    i=i+ 1 
    buf[i]=_str
	kol=kol+ 1 
    if left(_str, 1 )="+"
        n=i                     && число строки в буфере
        for i= 1  to n
	 =fputs(fo,buf[i])	
        endfor
        i= 0         
    endif
    if kol=_max_list
        if i=_max_list	&& буфер заполнился, а '+' не встретился
	    n=i         
    	    for i= 1  to n
	          =fputs(fo,buf[i])
	    endfor
	    =fputs(fo,chr( 12 ))
	    i= 0         
  	    kol= 0 
        else
	    =fputs(fo,chr( 12 ))
	    kol=i
        endif
    endif
enddo
* сбросим остаток
if i> 0 
    n=i
    for i= 1  to n
    	=fputs(fo,buf[i])
    endfor
endif
=fputs(fo,chr( 12 ))
=fclose(fi)
=fclose(fo)
Так что выбирай! :-)
...
Рейтинг: 0 / 0
Помогите "халявщику" в Foxpro for DOS
    #35107249
SSSQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тысяча благодарностей s_gonch !
Выбран второй вариант - работает без изменений, смотрю и не нарадуюсь!!!
Спасибо!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите "халявщику" в Foxpro for DOS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]