Помощь - Поиск - Пользователи - Календарь
Полная версия: Запись в конец строки ?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
unic
//
Lapp
Цитата(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
//
Lapp
Цитата(unic @ 10.03.2011 22:09) *
выбрал другой путь - через массив типа string
Можно и через массив (особенно, если массив динамический). Проблема только в том, что в общем случае файлы могут быть и больше имеющегося объема памяти.

Цитата
но когда файл прочитывается до конца , вылетает ошибка
собстно почему она возникает ? Вроде условия прописаны ..
Я не настолько хорошо (а точнее, совсем не) знаком с PascalABC, чтоб указывать на ошибку.. Но в нормальных компиляторах все же требуется сначала выделить память под массив (SetLength), а потом уже им пользоваться. Если этого не сделать, то произойдет выход за границы массива и порча памяти, которая может привести к любым ошибкам - в частности, как то, что ты получаешь.
Но я не очень удивлюсь, если в PascalABC введена возможность автоматической аллокации, как в PHP типа. Уж уродовать язык, так уродовать до конца..
volvo
Цитата
собстно почему она возникает ?
Потому что until c='#13'; и until c=#13; - это очень разные вещи... Ну, и не забывай, конечно, память под T выделять, а то ошибка будет другая...
unic
Всем огромное спасибо , нашел проблемы .

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

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

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

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

Цитата
Это не менее эффективно, чем твой голос при выборе президента
Такового не имею smile.gif
Unconnected
Можно отвечать только через сутки каждый раз) Вообще, не пойму, что за вредительство - боится, что одногруппники эту тему нагуглят? Даже если и так, то пусть лучше нагуглят, чем такое западло делать тем, кто ему помог dry.gif
unic
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума . Да и в принципе задание я выполнил , код отписал здесь +текст файла+задание в заголовке, 2 раза поблагодарил людей которые выручили , собстно что еще требуется от меня ? Да и в чем вопрос , у вас IPB стоит , по-моему в два клика можно восстановить сообщение (покрайней мере в VB была такая функция) . А вот оскорблять - это вы уже граждане сами некрасиво поступаете
Вячеслав Л.
Цитата
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума
Подумай, что произойдет с форумом, если каждый, кто посчитает свой вопрос глупым, удалит его?

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

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

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


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


Я считаю, это вранье. Ничего правдоподобнее придумать не мог? После разговора в теме ему вдруг внезапно показалось, что для ДАННОГО форума вопрос слишком глуп! Не захотел портить ветку глупыми вопросами, и всё стер.. не, надо было перенести на более "глупый" форум.
unic
я здесь регистрировался только чтобы задать вопрос , мне как то с высокой колокольни на репутацию и на ваши слова , которые я сейчас расцениваю , как попытку устроить холивар на пустом месте . разговор закончен , нарушил правила форума - бан , в противном случае понижение репутации . Так зачем же организовывать бессмысленную болтовню , если мне и так понятно что на данном форуме не приветствуется удаление своих же постов ?! Не понимаю..
Вячеслав Л.
Цитата
Так зачем же организовывать бессмысленную болтовню , если мне и так понятно что на данном форуме не приветствуется удаление своих же постов ?!
К чему тогда был этот пост? Нельзя было просто извиниться? Надо было придумать причину: ... Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума ...?

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

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