IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> процедура settextbuf в TMT pascal, TMT игнорирует settextbuf
pshenan
сообщение 27.11.2009 15:03
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


TMT игнорирует settextbuf()
TMT 3.9 DOS
Подскажите, можно ли решит проблему.
В Борланде все работает нормально.

Запускаю с дискеты в чистом досе без SmartDrv.exe
Работает очень медленно, изменение буфера никаких результатов не дает.
tmp.txt - Любой текстовый файл, объемом > несклько килобайт.



Var F : Text;
Ch : Char;
Buf : Array [1..32000] Of Char; {буфер}

F2:text;
Buf2 : Array [1..32000] Of Char; {буфер2}

Begin

Assign(F, 'tmp.txt');
Assign(F2, 'tmp2.txt');

SetTextBuf(F, Buf,sizeOf(Buf));
SetTextBuf(F2, Buf2,sizeOf(Buf2));

Reset(F);
Rewrite(F2);

While Not EOF(F) Do
Begin
Read(F, Ch);
Write(F2,Ch);
Write(Ch);
End;

Close(f);
Close(f2);

End.



Сообщение отредактировано: pshenan - 27.11.2009 15:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 28.11.2009 13:28
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


А в чем проблема? В том, что не работает одна из системных функций или в том, что медленно работает программа?

Дело в том, что SetTextBuf позволяет несколько улучшить работу неправильно написанной программы, но тем самым и приучает писать неправильно. Буферизация ввода/вывода (если она нужна, а из приведенного примера это не очевидно) делается несколько другим способом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
pshenan
сообщение 28.11.2009 15:28
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


Цитата(andriano @ 28.11.2009 14:28) *

А в чем проблема? В том, что не работает одна из системных функций или в том, что медленно работает программа?


Проблема в скорости работы. Конфигурационный файл постоянно изменяется и без smartdrv программа
подтормаживает. А со smartdrv, в случае сбоя, файл может испортиться, что крайне не желательно.
Хотелось бы самостоятельно управлять буферизацией и точно знать, когда файл записан на диск.
Вариант с settextbuf() выглядел не самым плохим. Теперь нужно думать о других способах.
Не подскажите, как организовать буферизацию в ТМТ?



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 28.11.2009 21:04
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Предварительное замечание: у меня сейчас нет компилятора, поэтому возможны мелкие ошибки.

В зависимости от того, что нужно сделать, и от размеров файлов можно идти разными путями.
Один из них - считать файл целиком в память и там с ним работать.
Если файл может превышать размеры буфера, то читать файл по частям длиной с буфер.

Var
F, F2 : file;
Ch : Char;
Buf, Buf2 : Array [1..32000] Of Char; {буфер}
L, i : word;
Begin
Assign(F, 'tmp.txt');
Assign(F2, 'tmp2.txt');

Reset(F,1);
Rewrite(F2,1);

While Not EOF(F) Do Begin
blockread(f, buf, 32000, L);
for i := 1 to L do begin
buf2[i] := buf[i];
Write(buf[i]);
end;
blockwrite(f2, buf2, L);
End;

Close(f2);
Close(f);

End.


Если нельзя организовать последовательную обработку файла в одном цикле (например, нужно посимвольно читать из разных мест программы), можно сделать отдельную процедуру добывания очередного символа, которая берет его либо из буфера, либо подчитывет очерадной фрагмент в буфер.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
pshenan
сообщение 28.11.2009 22:57
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


Цитата(andriano @ 28.11.2009 22:04) *

В зависимости от того, что нужно сделать, и от размеров файлов можно идти разными путями.
Один из них - считать файл целиком в память и там с ним работать.


Спасибо за совет andriano

Я тоже пришел к этому выводу, это наверное даже лучше.
Придется переписать модуль для работы с ini файлами через нетипизированный файл. Тогда читать можно один раз при старте программы, а при изменении писать сразу весь файл.

Может быть Вы встречали модуль для работы с ini файлами с подобной реализацией? Желательно объектный и без TurboVision, т.к. в TMT это проблемотично.

Сообщение отредактировано: pshenan - 28.11.2009 23:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 29.11.2009 20:51
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Честно говоря, я ОЧЕНЬ редко ищу какие-либо модули. Обычно написать смому - гораздо быстрее, да и результат получается намного лучше (в первую очередь по скорости работы).
Возможно, и сам компилятор ТМТ (для которого очень трудно найти "заточенные" под его модули) способствует именно такому стилю работы.

Кстати, читать текстовый файл как бинарный целиком, - наверное, единственный способ разбора многомегабайтных текстовых файлов (например, XML, текстовые форматы представления векторных файлов (*.OBJ, *.MP, *.X)) за вменяемое время.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
vladimirgonchar
сообщение 21.03.2011 15:54
Сообщение #7





Группа: Пользователи
Сообщений: 1
Пол: Мужской
Реальное имя: gооgle

Репутация: -  0  +


Можно как-нибудь настроить TMT Pascal, чтобы он нормально воспринимал русские буквы. А то он работает, как я понимаю, с Win-кодировкой, и при выполнении простейшей программы:

programm Probe;
begin
WriteLnПривет всем;
end.

на экран выводится что-то типа: "ЁштхЄ тёхь"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
pshenan
сообщение 21.03.2011 16:22
Сообщение #8





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


Цитата(vladimirgonchar @ 21.03.2011 15:54) *

Можно как-нибудь настроить TMT Pascal, чтобы он нормально воспринимал русские буквы. А то он работает, как я понимаю, с Win-кодировкой, и при выполнении простейшей программы:

programm Probe;
begin
WriteLnПривет всем;
end.

на экран выводится что-то типа: "ЁштхЄ тёхь"


Поставь шрифт Terminal и сможешь смотреть досовский текст. А сам текст нужно набирать в досовой кодировке во внешнем редакторе. Я использую ФАР с плагином COLORER. Очень удобно, есть поддержка синтаксиса и много
всяких полезностей
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 21.03.2011 21:32
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Вообще говоря, кодировка - это проблема Windows, к языку Pascal не имеющая никакого отношения.
Что касается настройки среды разработки для изготовления консольных прог, то к предыдущему посту могу добавить еще один совет:
Найти в И-нете и установить клавиатурный драйвер кодовой страницы 866. При этом сами раскладки будут переключаться в порядке EN-RU1251-RU866-EN...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 15.11.2024 11:25
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"