Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Запись в конец строки ?

Автор: unic 10.03.2011 16:37

//

Автор: Lapp 10.03.2011 19:07

Цитата(unic @ 10.03.2011 16:37) *
никак не соображу каким образом можно записать в конец строки (текстового файла) .
Задачка простая , считать-посчитать , но вот добавить в конец строки смутило.
формат файла :

<букофки> <букофки> <циферки> <сюда записать>

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

Например, тебе надо в 10-ю строку дописать 'asdf'. Это можно сделать как-то так:
fn:= 'myfile.txt';
assign(f,fn);
reset(f);
assign(t,'temp.txt');
rewrite(t);
i:= 0;
while not EoF(f) do begin
readln(f,s);
Inc(i);
if i=10 then s:= s+'asdf';
writeln(t,s)
end;
close(t);
close(f);
erase(f);
rename(t,fn);

Автор: unic 10.03.2011 22:09

//

Автор: Lapp 10.03.2011 22:49

Цитата(unic @ 10.03.2011 22:09) *
выбрал другой путь - через массив типа string
Можно и через массив (особенно, если массив динамический). Проблема только в том, что в общем случае файлы могут быть и больше имеющегося объема памяти.

Цитата
но когда файл прочитывается до конца , вылетает ошибка
собстно почему она возникает ? Вроде условия прописаны ..
Я не настолько хорошо (а точнее, совсем не) знаком с PascalABC, чтоб указывать на ошибку.. Но в нормальных компиляторах все же требуется сначала выделить память под массив (SetLength), а потом уже им пользоваться. Если этого не сделать, то произойдет выход за границы массива и порча памяти, которая может привести к любым ошибкам - в частности, как то, что ты получаешь.
Но я не очень удивлюсь, если в PascalABC введена возможность автоматической аллокации, как в PHP типа. Уж уродовать язык, так уродовать до конца..

Автор: volvo 10.03.2011 23:04

Цитата
собстно почему она возникает ?
Потому что until c='#13'; и until c=#13; - это очень разные вещи... Ну, и не забывай, конечно, память под T выделять, а то ошибка будет другая...

Автор: unic 10.03.2011 23:31

Всем огромное спасибо , нашел проблемы .

1) используя функцию setlength , я брал переменную i:=2 , тк отсчет в массивах начинается с 0 , получался массив размером 1 , эту же переменную использовал и при записи данных t[i] , те записывал во вторую ячейку , которой не существовало .

2) Избавился от while not eof(f) , оставив только repeat until eof(f);

и еще раз спасибо что нашли время для ответов на мои глупые вопросы .


Рабочая версия :


uses crt;

var t:array of string;
n:array of integer;
f:text;
i,h,a,b,z:integer;
s:string;
m:char;
begin

// Заносим строки в массив //

i:=2;
assign(f,'data.txt');
reset(f);
repeat
setlength(t,i);
readln(f,t[i-1]);
inc(i);
until eof(f);
setlength(n,i);

// Собираем среднее арифметическое

reset(f);
i:=i-2;
for h:=1 to i do
begin
repeat
read(f,m);
until m=' ';
repeat
read(f,m);
until m=' ';
readln(f,a,b,z);
n[h]:=round((a+b+z)/3);
end;
close(f);
//Начинаем записывать в файл
rewrite(f);
for h:=1 to i do begin
str(n[h],s);
writeln(f,t[h],' Средний балл :',' ',s);
end;
close(f);
writeln('Программа успешно выполнена');
readkey;
end.




Текстовый файл:

Цитата

Вася Васильев 33 55 22
Иван иванов 67 22 88
Петр Петров 11 13 66

Автор: Вячеслав Л. 11.03.2011 12:43

Надо ужимать время редактирования. Сколько можно читать ответы, не зная вопросов?

Автор: Lapp 11.03.2011 16:07

Цитата(Вячеслав Л. @ 11.03.2011 12:43) *
Надо ужимать время редактирования. Сколько можно читать ответы, не зная вопросов?

Уже ужато до полутора суток (если я правильно помню). Можно и больше ужать, но полицейские методы не всегда самые эффективные. Именно по этой причине я в последнее время стараюсь включать полную цитату в ответ (в этой теме она тоже есть).

Совет:
если тебе не нравятся действия пользователя - у тебя всегда есть право понизить ему репутацию. Не надо перекладывать это на админов. И не надо говорить, что это неэффективно. Это не менее эффективно, чем твой голос при выборе президента yes2.gif.

Просьба:
красить сообщения, не относящиеся к собственно теме, в серый цвет.

Автор: Вячеслав Л. 12.03.2011 14:54

Цитата
если тебе не нравятся действия пользователя - у тебя всегда есть право понизить ему репутацию
Хорошо. Я только боюсь, что unic все равно своего добился: содержимое его сообщений никто не увидит. А то, что он имеет репутацию 0, -1 или -10, ему наплевать на это, так что, боюсь, без "полицейских" мер все равно не обойтись.

Цитата
Это не менее эффективно, чем твой голос при выборе президента
Такового не имею smile.gif

Автор: Unconnected 12.03.2011 16:14

Можно отвечать только через сутки каждый раз) Вообще, не пойму, что за вредительство - боится, что одногруппники эту тему нагуглят? Даже если и так, то пусть лучше нагуглят, чем такое западло делать тем, кто ему помог dry.gif

Автор: unic 12.03.2011 16:29

Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума . Да и в принципе задание я выполнил , код отписал здесь +текст файла+задание в заголовке, 2 раза поблагодарил людей которые выручили , собстно что еще требуется от меня ? Да и в чем вопрос , у вас IPB стоит , по-моему в два клика можно восстановить сообщение (покрайней мере в VB была такая функция) . А вот оскорблять - это вы уже граждане сами некрасиво поступаете

Автор: Вячеслав Л. 12.03.2011 17:06

Цитата
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума
Подумай, что произойдет с форумом, если каждый, кто посчитает свой вопрос глупым, удалит его?

Цитата
Да и в принципе задание я выполнил , код отписал здесь +текст файла+задание в заголовке, 2 раза поблагодарил людей которые выручили , собстно что еще требуется от меня ?
Сдал сам, подумай о других. У кого-то будет такой же вопрос и человек сможет найти его через поисковик или через поиск по форуму. Возможно такое? Ты лишаешь людей этой возможности.

Цитата
Да и в чем вопрос , у вас IPB стоит , по-моему в два клика можно восстановить сообщение (покрайней мере в VB была такая функция)
Зачем лишний раз дергать администратора, если можно просто оставить как было?

Цитата
А вот оскорблять - это вы уже граждане сами некрасиво поступаете
+1 Unconnected, ты не прав.

Может, отделить последние сообщения?

Автор: Unconnected 12.03.2011 17:19

Цитата
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума .


Я считаю, это вранье. Ничего правдоподобнее придумать не мог? После разговора в теме ему вдруг внезапно показалось, что для ДАННОГО форума вопрос слишком глуп! Не захотел портить ветку глупыми вопросами, и всё стер.. не, надо было перенести на более "глупый" форум.

Автор: unic 12.03.2011 19:41

я здесь регистрировался только чтобы задать вопрос , мне как то с высокой колокольни на репутацию и на ваши слова , которые я сейчас расцениваю , как попытку устроить холивар на пустом месте . разговор закончен , нарушил правила форума - бан , в противном случае понижение репутации . Так зачем же организовывать бессмысленную болтовню , если мне и так понятно что на данном форуме не приветствуется удаление своих же постов ?! Не понимаю..

Автор: Вячеслав Л. 13.03.2011 15:59

Цитата
Так зачем же организовывать бессмысленную болтовню , если мне и так понятно что на данном форуме не приветствуется удаление своих же постов ?!
К чему тогда был http://forum.pascalnet.ru/index.php?s=&showtopic=27952&view=findpost&p=153661 пост? Нельзя было просто извиниться? Надо было придумать причину: ... Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума ...?

Цитата
как попытку устроить холивар на пустом месте
Ну, нам заняться нечем dry.gif

Цитата
нарушил правила форума - бан
Бан - крайняя мера, полностью согласен с администрацией. Если банить за каждое нарушение...