Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.128.199.88] |
|
Сообщ.
#1
,
|
|
|
имеется текстовый файл. Я хочу прочитать и записать построчно с 1 строки и дальше(3 строки прочитать, 2 записать). Но запись для текстового файла предполагает при append в конец файла или rewrite, а как сделать с начала?
Var F:TextFile; begin AssignFile(F,FolderSQL+ListBox1.Items[ListBox1.ItemIndex]); Reset(F); readln(F,S); readln(F,S); readln(F,S); S:='1'; Writeln(F,S); S:='set @d2='''+DateToStr( MonthCalendar2.Date)+''''; Writeln(F,S); CloseFile(f); на write ошибка IO error 105. Добавлено Нашел такое решение: SF:TStringList; begin SF:=TStringList.Create; SF.LoadFromFile(FolderSQL+ListBox1.Items[ListBox1.ItemIndex]); SF.Strings[3]:='set @d1='''+DateToStr( MonthCalendar1.Date)+''''; SF.Strings[4]:='set @d2='''+DateToStr( MonthCalendar2.Date)+''''; SF.SaveToFile(FolderSQL+ListBox1.Items[ListBox1.ItemIndex]); SF.Free; end; минусы думаю очевидны. |
Сообщ.
#2
,
|
|
|
никак
читай из одного, пиши в другой |
Сообщ.
#3
,
|
|
|
Кстати такой ещё вопрос.
Если я хочу через ShellExecute передать русские символы, какие строки я должен применять? const FolderSQL='\\server\Сотрудники\Отдел Права\Отчеты ПМ\Запросы программа\'; Var S:String;//какая строка? begin S:='/C '''+FolderSQL+ListBox1.Items[ListBox1.ItemIndex]+'.cmd'''; ShowMessage(s); ShellExecute(0, 'open', 'cmd.exe', PWideChar(S), nil, SW_SHOW);//Что вместо PWideChar должно быть? end; |
Сообщ.
#4
,
|
|
|
В двойные кавычки строку заключи. Delphi какая версия?
|
Сообщ.
#5
,
|
|
|
delphi Berlin,
"`Привет`", так чтоли? |
Сообщ.
#6
,
|
|
|
Пример:
ShellExecute(Application.Handle, 'open', PChar('"C:\DelphiInstallation\bin\bds.exe"'), PChar('-pDelphi "C:\Source\YourProjectFile.dproj"'), nil, SW_SHOWNORMAL) Параметр, включающий файловый путь (длинный, с пробелами, с русскими символами), заключен в двойные кавычки (это требование Windows) |
Сообщ.
#7
,
|
|
|
Цитата ^D^ima @ Но запись для текстового файла предполагает при append в конец файла или rewrite, а как сделать с начала? Никак. TextFile м.б. открыт либо только на чтение (reset), либо только на запись (rewrite и append). Поэтому если нужно что-то изменить в начале\середине файла, то возможны несколько вариантов: 1) Вариант Shaggy: "читай из одного, пиши в другой", используя TextFile. После окончания записи можно удалить исходный файл и затем переименовать новый в исходный. 2) Открыть файл как двоичный на чтение и запись. Прочитать начало файла (или весь файл) в строку S нужного размера, ручками найти строки с нужными номерами (с помощью PosEx или ExtractStrings) и заменить их на новые. Если при этом длина текста не изменяется (суммарная длина измененных строк остается прежней), то просто перезаписываем начало файла и всё. Если же изменяется, то в общем случае придется помучиться с перезаписью всего хвоста файла со смещением в плюс или минус. Поскольку эта задачка в общем случае нетривиальная, то "минусы думаю очевидны". Поэтому если файл не слишком большой, то проще его читать целиком и соотв-но перезаписывать целиком (или от начала изменений, если они находятся не в начале файла, а где-то в середине). 3) Но если файл не слишком большой, то самое простое - это прочитать его в TStringList, заменить нужные строки и сохранить в файл с тем же именем (= "Нашел такое решение"). Минусы по сравнению с другими вариантами "очевидны" только для сравнительно больших\огромных файлов. (Основной "минус" по сравнению с вариантом 2 с загрузкой всего файла - это то, что при Load и Save требуется удвоенный размер памяти под исходный или сохраняемый текст и строки TStringList, а скорость разборки\сборки строк существенной роли не играет, т.к. по любому выполняется намного быстрее чтения самого файла). |
Сообщ.
#8
,
|
|
|
leo
Спасибо за полный ответ, а такие вещи как ReadFile и WriteFile это какие-то чисто апишные функции? Их использование когда бывает оправдано? MBo сейчас попробую |
Сообщ.
#9
,
|
|
|
Цитата ^D^ima @ S:String;//какая строка? ...//Что вместо PWideChar должно быть? Просто String и просто PChar. Каждая версия дельфи сама разруливает, какой вариант строк используется по умолчанию и соотв-но какой вариант функции ShellExecute использовать (А или W). Добавлено В двойные кавычки нужно заключать строки, содержащие пробелы, т.к. пробел по умолчанию является разделителем параметров командной строки. При этом не важно какие символы используются в строке - русские или не русские. Добавлено Цитата ^D^ima @ а такие вещи как ReadFile и WriteFile это какие-то чисто апишные функции? Их использование когда бывает оправдано? Да, чисто апишные. Их обертками в дельфи являются FileRead и FileWrite. По сути BlockRead и BlockWrite тоже используют эти функции. Поэтому принципиальной разницы между ними нет. Разница лишь в том, что Read\WriteFile и FileRead\Write используют хэндл файла, получаемый апишной ф-ей CreateFile или дельфийской FileOpen. А в переменной типа File этот хэндл скрыт в структуре TFileRec(f).Handle. Поэтому "оправданность" может заключаться не в самих функциях чтения\записи, а использовании более продвинутой функции CreateFilе с возможностью задания дополнительных опций\флагов открытия файла. Добавлено PS: Или даже не продвинутых, а более понятных, например разрешений чтения записи файла другими процессами FILE_SHARE_READ\WRITE, вместо малопонятной дельфийской FileMod, не разрешающей, а запрещающей чтение\запись (например fmShareDenyWrite = FILE_SHARE_READ, а fmShareDenyRead = FILE_SHARE_WRIE). |
Сообщ.
#10
,
|
|
|
да,в "" заработало. Я почему-то использовал одинарные '' видимо автоматом как в дельфи...
|