Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Напишите программку 
:(
    Опции темы
Гость_Сергей
Дата 29.7.2005, 17:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет!

Может ктото сделать такую консольную прогу (точнее две):

1.
запускаем прогу с нужным мне параметром.

app.exe /F

где F - буква диска

прога по завершению работы на выходе создает .txt файл

app.txt к примеру

в котором записаны номера нечитабельных секторов (т.е. прога прочекала нужный мне диск)
пусть будет сектор 100,101,102 нечитабельные к примеру

2.

запускаем прогу с другим параметром

app2.exe app.txt

прога по завершению работы на выходе создает другой .txt файл
в котором
100-1,101-1,102-1

или

100-0,101-0,102-0

где 1 - сектор прочитан успешно или 0 - непрочитан


извиняюсь за ламерскую просьбу, но очень нужно, помогите.


  Вверх
DIMONSOFT
Дата 29.7.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 19.12.2004
Где: Киев

Репутация: нет
Всего: -3



Цитата
запускаем прогу с нужным мне параметром.

Код

Paramcount - показывает сколько параметров передано 
Paramstr(0) - это имя с путем твоей программы 
Paramstr(1) - имя первого параметра 
Paramstr(2) - имя второго параметра и т.д. 

Если ты запускаешь: 

с:\myprog.exe /a -b22 c:\dev 

то Paramcount будет равен 3 
Paramstr(0) будет равен с:\myprog.exe 
Paramstr(1) будет равен /a 
Paramstr(2) будет равен -b22 
Paramstr(3) будет равен c:\dev 


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

Например у тебя возможно 3 параметра: 

Если параметр = "/v" то выдать сообщение, если параметр "/c" то покрасить форму в синий цвет, если параметр "/f" - поменять заголовок формы: 

if paramstr(1) = '/v' then 
  showmessage('Parameter "/v" was found!'); 
if paramstr(1) = '/c' then 
  color := clBlue; 
if paramstr(1) = '/f' then 
  caption := 'Parameter "/f" was found'; 

Поставь этот код на событие формы onActivate, откомпиллируй и попробуй запустить программу с одним из 3х указанных параметров и ты увидишь что произойдет. 




Цитата
прога по завершению работы на выходе создает .txt файл

Код

Для более тонких операций над текстовыми файлами прийдется освоить очень древний паскалевский способ. 

Итак, для доступа к текстовым файлам используется переменная типа TextFile. До сих пор не совсем понимаю что это такое физически - что-то типа "внутреннего" паскалевского Handle на файл. 

Итак чтобы ассоциировать файл на диске с переменной надо проделать следующие опрерации: 

1) Определяем файловую переменную: 
 var f:TextFile;     

2) Ассоциируем ее: 

 AssignFile(F, 'c:\MyFile.txt');     


3) Теперь надо этот файл открыть, есть 3 варианта: 
- файла нет или он должен быть перезаписан, открытие для записи: 
Rewrite(f)    

- файл есть и его надо открыть для чтения (с первой строки) 
Reset(f)    

- файл есть и его надо открыть для дописования строк в конец 
Append(f)    

Как видите не хватает очень полезных функций таких как открытия файла для чтения с произвольной строки и для записи в файл произвольной строки. Но надо учесть, что так как длины строк разные, не существует никакого способа узнать физическое место начала например 1000 строки, не прочитав всю тысячу строк. Для записи ситуация еще сложнее - вставить строку означает перезаписать всю информацию после этой строки заново. Таким образом варианты только следующие: 
- Перезаписать весть файл 
- Читать с первой строки 
- Дописать что-то в конец 
- Читать и писать файл целиком (см. выше работу через TStrings) 

В конце работы открытый файл нужно закрыть: 
CloseFile(f);    

Теперь пусть у нас есть строковая переменная s для чтения строки из файла 

Чтение предварительно открытого файла: 
ReadLn(f, s) - будет прочитанна текущая строка и позиция чтения переведена на следующую позицию.    

А как прочитать весь файл? 

While not eof(f) do   
 begin   
 
  
 ReadLn(f, s);   
 
 {здесь делаем что-то с прочитанной строкой}   
 
  
 end;      
 
  

Хорошо, а если файл несколько метров есть ли способ поставить какой-нибудь ProgressBar или Gauge чтобы показывал сколько считанно? Есть, но не совсем прямой - не забыли, сколько строк в файле заранее мы не знаем, узнать можно только прочитав его весь, но показометер мы все-таки сделаем: 

var Canceled:Boolean; 

Function GetFileSize(FIleName:String):integer; 
 var f: File of Byte;  
 
  
begin 
 try  
 
  
 AssignFile(f, FileName);  
 
 Reset(f);  
 
 result:=filesize(F);  
 
 CloseFile(f);  
 
  
 except  
 
  
 result:=-1;  
 
  
 end;  
 
  
end; 


Procedure ReadMyFile; 
 Var i,j:integer;  
 
  
Begin 
 ProgressBar1.Max:=GetFileSize('c:\MyFile.txt');  
 
 ProgressBar1.position:=0;  
 
 assignfile(f,'c:\MyFile.txt');  
 
 Canceled:=False;  
 
 reset(f);  
 
 i:=0;j:=0;  
 
 while not eof(f) do  
 
  
 begin  
 
  
 inc(j);  
 
 readln(f,s);  
 
 i:=i+length(s)+2;  
 
 if (j mod 1000)=0 then  
 
  
 begin  
 
  
 ProgressBar1.position:=i;  
 
 Application.ProcessMessages;  
 
 if canceled then break;  
 
  
 end;  
 
  
 {здесь мы что-то делаем с прочитанной строкой}  
 
  
 end;  
 
  
 CloseFile(f);  
 
  
End; 

Теперь комментарии к коду. 
1) Функию GetFileSize я рсссмотрю после, она немного по другому подходит к чтению файла (кстати я знаю еще по крайней мере 3 способа ее реализации, поэтому не нужно указывать что это можно сделать легче, быстрее или просто по другому - просто давайте разберем это позже) 
2) Переменная i - все время указывает на количество байт которое мы считали - мы определяем длину каждой строки и прибавляем 2 (символы конца строки). Зная длину файла в байтах и сколько байт прочитано можно оценить и прогресс, но 
3) Если ставить изменение прогресса после каждой строки, то это очень сильно тормознет процесс. Поэтому вводим переменную j и обновляем прогресс например 1 раз на 1000 прочитанных строк 
4) Переменная Canceled - глобальная переменная. Поставьте на форму кнопку, в обработчике нажатия поставьте Canceled:=True; и нажатие кнопки прервет чтение файла. 


Теперь как писать в текстовый файл: 

Запись целой строки: 
Writeln(f,s);    

Запись кусочка строки(те следующая операция записи будет произведена в ту же строку): 

Write(f,s);    

Если переменная s содержит больше 255 символов (т.е. является длинной строкой), то таким способом ни фига не запишится, в файл вместо строки попадут 4 байта указателя на нее. Надо делать так: 

Writeln(f,pointer(s)^);    


*******************ВЗЯТО ИЗ ДРКБ*********************
Остальное незнаю...
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.