Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.169] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Помогите разобраться с задачей!!
есть файл из него надо удалить 3 строки зная 1 а после этого вставить в этот же файл (удал)1 строку и измененные 2 и 3. HELP! ??? я сделал ее но когда я начинаю вставлять заного 1 строку он впереди нее ставит 13 символов ( |
Сообщ.
#2
,
|
|
|
Ну и где текст программы? Тут телепатов нема.
|
Сообщ.
#3
,
|
|
|
Вот это текст delete
procedure delet(rec:string;tr:string); var frr:text; fr,fr2:text; nsr,sr,sr2:string; begin if zagryzka2(rec,tr)=false then {это проверка нахождение строки rec в файле tr} begin writeln(); end; nsr:=tr; delete(nsr,6,4);{у всех имен файлов по 5 букв и +3} sr2:=nsr; nsr:=nsr+'.BAK'; assign(frr,tr); writeln(sr2,nsr); readln; assign(fr2,nsr); rewrite(fr2); reset(frr); while not eof(frr) do begin readln(frr,sr); writeln(fr2,sr); end; close(frr); close(fr2); erase(frr); assign(fr2,nsr); assign(fr,tr); rewrite(fr); reset(fr2); while not eof(fr2) do begin readln(fr2,sr); if sr=rec then begin readln(fr2); readln(fr2); end else writeln(fr,sr); end; close(fr); close(fr2); end; |
Сообщ.
#4
,
|
|
|
Кошмар, у тебя не программа, а китайская грамота ) без обид ))))
А можно поподробнее, что с файлом нужно сделать ? Если я правильно понял, то тебе надо найти в нём какую то строку, и после неё поменять две последующие строки на другие (или на их же, только немного изменённые) ? А как нужно изменить строки ? На что менять ? Эти две новые строки должны передаваться как параметры к твоей процедуре Delete (в месте с строкой, коротую искать) ? |
Сообщ.
#5
,
|
|
|
Профессор, а нельзя ли получше объяснить, а то я чего-то не понял в условии??
Напиши чего ты конкретно хочешь! |
Сообщ.
#6
,
|
|
|
Лано я не профессор но попытаюсь объяснить
Зада в том что : есть файл из него надо удалить 3 строки зная 1ую строку! delet(x,xx); x-содержание 1 строки(а след 2 идут сразу после 1!!) xx-название файла а вот когда я начинаю применять функцию delet происходит я помоему все испробовал !! assign(fdd,'xx'); {$I-} append(fdd); {$I+} if ioresult<>0 then begin rewrite(fdd); end; if zagryzka2(s,'xx')=false then{see up} begin writeln(fdd,s); writeln(fdd,s2); writeln(fdd,s3); end else begin zagryzka(s,'xx');{это функция дастоет по s потом 2 потом 3(s-первая строка)} delet(s,'xx');{это оно и есть!} {хотя s=s!!100%} ??? ??? writeln(fdd,s);{вот тут загвоздка вместо s будет 13символов +s} ??? ??? writeln(fdd,a);{integer} writeln(fdd,s3+c);{integer} end; close(fdd); а вот тут задача в том чтобы открыть файл и узнать если в нем строка s если есть то удалить ее и 2 посл строки и добавить 1стр и 2стр без измен и 3стр с измен(точто было + точто в c)!!! если нету то просто записать 1 2 3 введ выше!! |
Сообщ.
#7
,
|
|
|
ДОКТОР !!!
1. Процедуры delet не существует в природе, как и не существует в природе процедуры, которая одним махом удаляла бы определённые строки из файла. 2. Уже существующий файл открывают не assign;append;rewrite, а assign;reset для чтения, assign;append для добавления строк в конец, assign;rewrite для полной перезаписи! Я всё равно не понял... зачем удалять первые две строки, если их надо записать обратно без изменений? Удаляются строки из файла путём последовательного чтения и записи в другой файл, пропуская те строки, которые надо удалить. |
Сообщ.
#8
,
|
|
|
Ну если просто нужно удалить из файла три строки, начиная с известной, то:
procedure DelString(FileName,StringToDelete:String); var f1,f2:text; s:string; begin assign(f1,FileName); assign(f2,'temp.dat'); reset(f1); rewrite(f2); while not eof(f1) do begin readln(f1,s); if s<>StringToDelete then writeln(f2,s) else begin readln(f1); {Читаем ещё две лишние строки} readln(f1); end; end; close(f1); close(f2); erase(f1); rename(f2,FileName); end; |
Сообщ.
#9
,
|
|
|
JIN X если ты посмотришь выше то увидешь(2 moe soobshenie) процедуру delet :D
извини запарил с написанием за 1 строкой удал не 2 последних а 2 последующих!!! да насчет rewrite reset append я все знаю поэтому там так и написано: если файл есть то append если нет то rewrite ;D да ну так все таки почему добовляються 13 символов(смотри мое сообщ выше) да и что за ошибка? This error is reported if an invalid file handle is passed to a DOS system call. This error should never occur; if it does, you know that the file variable is somehow trashed. ??? ??? |
Сообщ.
#10
,
|
|
|
А мои посты ты игнорируешь ?
|
Сообщ.
#11
,
|
|
|
нет я ни кого не игнорирую !
sorry так всетки как мне ее испраить???? |
Сообщ.
#12
,
|
|
|
Тогда чем тебе не нравится тот вариант, который я написал ???
Я не правильно понял условие ? Jin-X правильно говорит, твою задачу нужно реализовывать открывая два файла, один на запись, другой на чтение, и читая из одного вписывать в другой все строки кроме трёх ненужных. Мой вариант именно так и делает. Это единственный нормальный способ решения такой задачи, и с любой точки зрения самый правильный. Можно конечно попробовать сделать так, как пытаешься сделать ты, но ведь это то же самое, что скажем вместо массива из 100 элементов объявлять 100 переменных и работать с ними. Можно, но не нужно ))) Тоесть я всё веду к тому, что может твой вариант и можно исправить, но он такой запутанный, и .. мм.. как бы это сказать, чтоб не обидеть - нелогично написанный, что лучше постарайся понять тот вариант, что советуем тебе я и Jin-X. [right]С наилучшими пожеланиями Some1 & Jin-X[/right] |
Сообщ.
#13
,
|
|
|
понимаешь то что ты написал программу ето хорошо но пойми
что это тоже самое что моя функция delet !!!! токо переменные другие!!! а мне надо вот что !!! а вот тут задача в том чтобы открыть файл и узнать если в нем строка s если есть то удалить ее и 2е последующие строки и добавить 1стр и 2стр без измен и 3стр с измен(точто было + точто в c)!!! я сделал так 1- ищу если строка(х) в файле! если есть то я запоминаю х и после нее 2 строки потом удаляю их и записываю в конец с изменениями 3 стороки! а если нету то просто загружаю 3 введенные строки сам етот кусок проги я написал смотри выше!!!!!! если нету то просто записать 1 2 3 введ выше!! так все таки в чем тут проблема ? и почему после удаления в начало файло записываеться 13 символов? да и если не сложно ответить что за ошибка? This error is reported if an invalid file handle is passed to a DOS system call. This error should never occur; if it does, you know that the file variable is somehow trashed. ??? ??? |
Сообщ.
#14
,
|
|
|
Ладно.
Ищем в файле строку StringToDelete, и если находим, то флаг found устанавливаем в паравду, и запоминаем две последующие строки, без записи во второй файл. После выполнения цикла "while not eof(f1) do" флаг found будет равен true только в одном случае - если в файле была найдена строка StringToDelete. И в конце алгоритма, если так и произошло, то в конец второго файла мы добавим, как ты говоришь первую и вторую строки без изменения, и третью плюс c. У тебя нигде не написано, что за c такое, и я так понял оно у тебя известно по условию, поэтому я модифицировал процедуру так, чтобы c передавалась ей в качестве параметра. procedure DelString(FileName,StringToDelete:String;C:TypeOfC); var {Я не знаю, какого типа C - string, или char, поэтому написал C:TypeOfC} f1,f2:text; s,s2,s3:string; found:boolean; begin assign(f1,FileName); assign(f2,'temp.dat'); reset(f1); rewrite(f2); found:=false; while not eof(f1) do begin readln(f1,s); if s<>StringToDelete then writeln(f2,s) else begin found:=true; readln(f1,s2); {Запоминаем ещё две лишние строки} readln(f1,s3); end; end; close(f1); if found then {Если мы нашли строку, StringToDelete то добавим в конец файла...} begin writeln(f2,StringToDelete); writeln(f2,s2); writeln(f2,s3+c); end; close(f2); erase(f1); rename(f2,FileName); end; |
Сообщ.
#15
,
|
|
|
Цитата Это значит:This error is reported if an invalid file handle is passed to a DOS system call. This error should never occur; if it does, you know that the file variable is somehow trashed. Цитата Эта ошибка возникает если неверная внутренняя переменная, связанная с файлом была передана системному вызову DOS. Эта ошибка не должна никогда появляться. Если она всё же появилась, то даёт тебе знать о том, что переменная, связанная с файлом каким то образом была повреждена. Мораль сей басни такова - если у тебя появилась такая ошибка, то значит у тебя программа написана настолько некорректно, что портит содержимое переменных, таких как f1,f2,f3:text. |