никак не соображу каким образом можно записать в конец строки (текстового файла) . Задачка простая , считать-посчитать , но вот добавить в конец строки смутило. формат файла :
<букофки> <букофки> <циферки> <сюда записать>
Давай уточним. Ты имеешь текстовый файл, содержащий некоторое количество строк, и хочешь добавить фрагмент в конец некоторой строки (не обязательно последней)? Если так, то тебе придется перезаписать весь остаток файла, начиная с той строки, которую ты редактируешь. При этом возникнет проблема: если бы будешь писать в тот же файл, то ты будешь затирать то, что еще не прочитал. Поэтому ты либо прочти весь файл в какой-то буфер, либо (на практике лучше) пиши новый файл с другим названием (временный), а по окончании процесса сотри старый файл и переименуй новый.
Например, тебе надо в 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
11.03.2011 2:09
//
Lapp
11.03.2011 2:49
Цитата(unic @ 10.03.2011 22:09)
выбрал другой путь - через массив типа string
Можно и через массив (особенно, если массив динамический). Проблема только в том, что в общем случае файлы могут быть и больше имеющегося объема памяти.
Цитата
но когда файл прочитывается до конца , вылетает ошибка собстно почему она возникает ? Вроде условия прописаны ..
Я не настолько хорошо (а точнее, совсем не) знаком с PascalABC, чтоб указывать на ошибку.. Но в нормальных компиляторах все же требуется сначала выделить память под массив (SetLength), а потом уже им пользоваться. Если этого не сделать, то произойдет выход за границы массива и порча памяти, которая может привести к любым ошибкам - в частности, как то, что ты получаешь. Но я не очень удивлюсь, если в PascalABC введена возможность автоматической аллокации, как в PHP типа. Уж уродовать язык, так уродовать до конца..
volvo
11.03.2011 3:04
Цитата
собстно почему она возникает ?
Потому что until c='#13'; и until c=#13; - это очень разные вещи... Ну, и не забывай, конечно, память под T выделять, а то ошибка будет другая...
unic
11.03.2011 3: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 16:43
Надо ужимать время редактирования. Сколько можно читать ответы, не зная вопросов?
Lapp
11.03.2011 20:07
Цитата(Вячеслав Л. @ 11.03.2011 12:43)
Надо ужимать время редактирования. Сколько можно читать ответы, не зная вопросов?
Уже ужато до полутора суток (если я правильно помню). Можно и больше ужать, но полицейские методы не всегда самые эффективные. Именно по этой причине я в последнее время стараюсь включать полную цитату в ответ (в этой теме она тоже есть).
Совет: если тебе не нравятся действия пользователя - у тебя всегда есть право понизить ему репутацию. Не надо перекладывать это на админов. И не надо говорить, что это неэффективно. Это не менее эффективно, чем твой голос при выборе президента .
Просьба: красить сообщения, не относящиеся к собственно теме, в серый цвет.
Вячеслав Л.
12.03.2011 18:54
Цитата
если тебе не нравятся действия пользователя - у тебя всегда есть право понизить ему репутацию
Хорошо. Я только боюсь, что unic все равно своего добился: содержимое его сообщений никто не увидит. А то, что он имеет репутацию 0, -1 или -10, ему наплевать на это, так что, боюсь, без "полицейских" мер все равно не обойтись.
Цитата
Это не менее эффективно, чем твой голос при выборе президента
Такового не имею
Unconnected
12.03.2011 20:14
Можно отвечать только через сутки каждый раз) Вообще, не пойму, что за вредительство - боится, что одногруппники эту тему нагуглят? Даже если и так, то пусть лучше нагуглят, чем такое западло делать тем, кто ему помог
unic
12.03.2011 20:29
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума . Да и в принципе задание я выполнил , код отписал здесь +текст файла+задание в заголовке, 2 раза поблагодарил людей которые выручили , собстно что еще требуется от меня ? Да и в чем вопрос , у вас IPB стоит , по-моему в два клика можно восстановить сообщение (покрайней мере в VB была такая функция) . А вот оскорблять - это вы уже граждане сами некрасиво поступаете
Вячеслав Л.
12.03.2011 21:06
Цитата
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума
Подумай, что произойдет с форумом, если каждый, кто посчитает свой вопрос глупым, удалит его?
Цитата
Да и в принципе задание я выполнил , код отписал здесь +текст файла+задание в заголовке, 2 раза поблагодарил людей которые выручили , собстно что еще требуется от меня ?
Сдал сам, подумай о других. У кого-то будет такой же вопрос и человек сможет найти его через поисковик или через поиск по форуму. Возможно такое? Ты лишаешь людей этой возможности.
Цитата
Да и в чем вопрос , у вас IPB стоит , по-моему в два клика можно восстановить сообщение (покрайней мере в VB была такая функция)
Зачем лишний раз дергать администратора, если можно просто оставить как было?
Цитата
А вот оскорблять - это вы уже граждане сами некрасиво поступаете
+1 Unconnected, ты не прав.
Может, отделить последние сообщения?
Unconnected
12.03.2011 21:19
Цитата
Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума .
Я считаю, это вранье. Ничего правдоподобнее придумать не мог? После разговора в теме ему вдруг внезапно показалось, что для ДАННОГО форума вопрос слишком глуп! Не захотел портить ветку глупыми вопросами, и всё стер.. не, надо было перенести на более "глупый" форум.
unic
12.03.2011 23:41
я здесь регистрировался только чтобы задать вопрос , мне как то с высокой колокольни на репутацию и на ваши слова , которые я сейчас расцениваю , как попытку устроить холивар на пустом месте . разговор закончен , нарушил правила форума - бан , в противном случае понижение репутации . Так зачем же организовывать бессмысленную болтовню , если мне и так понятно что на данном форуме не приветствуется удаление своих же постов ?! Не понимаю..
Вячеслав Л.
13.03.2011 19:59
Цитата
Так зачем же организовывать бессмысленную болтовню , если мне и так понятно что на данном форуме не приветствуется удаление своих же постов ?!
К чему тогда был этот пост? Нельзя было просто извиниться? Надо было придумать причину: ... Удалил лишь по тому что считал свой вопрос уж больно глупым для данного форума ...?
Цитата
как попытку устроить холивар на пустом месте
Ну, нам заняться нечем
Цитата
нарушил правила форума - бан
Бан - крайняя мера, полностью согласен с администрацией. Если банить за каждое нарушение...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.