Страница 1 из 3

Чтение и запись длинного текста

Добавлено: 22 янв 2007, 17:26
Колядин Максим
Здравствуйте программисты. Дело вот в чём - не могу написать программу, которая бы читала из текстового файла 3 символа, в 6 столбце (Y), начиная с 1005 (X); (x=1005,y=6) Точно так же и с записью - записать 3 символа начиная с 1005. Как перейти на 6-ой столбец я знаю, а вот с 1005 начать чтение - нет.

Re: Чтение и запись длинного текста

Добавлено: 22 янв 2007, 19:00
Хыиуду

Код: Выделить всё

var s:string;c:char;
begin
for i:=1 to 6 do
   readln(f,s)
for i:=1 to 1005 do
   read(f,c)
Если я правильно понял, что требуется

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 00:39
Колядин Максим
Да, спасибо, с чтением вы меня правильно поняли, но только нужно чтобы не один символ читался, а несколько, до знака ";"
Например "4323;" переменная должна принять значение "4323".
А вот с записью я не разберусь. Мне нужно сначала удалить все символы до знака ";" (в нашем случае, удаляться должны "4323") затем записать туда новые, с учётом того далее 1005-го символа есть ещё символы, у меня вот такой текст:

_____________
beginning; strong=567; ...
...
...
...
...
... (999-ый символ) speed=4323; agility=77889;
soul=5565; maxHP=223; ... и т.д
_____________
Ясно, что начиная с 1005-го символа начнётся значение переменной speed, вот мне нужно, изменить его значение вручную, через мою программу. Нужно сделать
1) Удалить все символы, до знака ";", начиная с 1005-го.
2) Записать туда новое значение переменной speed

Вот собственно и всё что нужно сделать.

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 12:47
somewhere
Колядин Максим, нужно формально разделить файл на 3 части:
1. Данные до параметра (speed=4323 ;)
2. Сам параметр
3. Данные после параметра

Т.е. тебе нужно создать новый файл, записать (1) изменить параметр и записать его (2) и потом записать (3). Потом старый файл удалить, а новый переименовать

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 14:41
Колядин Максим
Жаль что так... В программе стоит условие "не создавая для этого новые файлы". Но всё равно, информация полезна - спасибо.

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 16:56
Колядин Максим
Ладно, допустим, что можно создавать новые файлы. Тогда как сложить 3 текста в один?

(Пусть, текст до значения будет "before.txt", само значение "speed" будет выражено переменной типа integer (Var speed : integer ;) , текст после - "after.txt", а сложенный текст (before+speed+after) будет назван "answ.txt")

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 17:11
somewhere
&quot писал(а):Жаль что так... В программе стоит условие "не создавая для этого новые файлы". Но всё равно, информация полезна - спасибо.
Ну тогда так:
1. Читаешь эту строку
2. Ищешь позицию "speed=" в строке
3. Создаешь новую строку которая включает все до "speed=" (A)
4. Ищешь позицию ";" после "speed="
5. Создаешь строку, в которой все данные после ";" (B)
6. Создаешь строку С=A+'speed='+Inttostr(speed)+';'+B
7. Читаем блок (D) в память после нужной строки с помощью BlockRead
8. Записывем С с позиции начала нужной строки в файл
9. Записываем дальше прочитанный блок D в файл.

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 17:16
somewhere
&quot писал(а):Ладно, допустим, что можно создавать новые файлы. Тогда как сложить 3 текста в один?
(Пусть, текст до значения будет "before.txt", само значение "speed" будет выражено переменной типа integer (Var speed : integer, текст после - "after.txt", а сложенный текст (before+speed+after) будет назван "answ.txt")

Код: Выделить всё

Assign(F1,'before.txt');
Reset(F1);
Assign(F2, 'after.txt');
Reset(F2);
Assign(F3, 'answ.txt');
Rewrite(F3);
While not eof(F1) do begin;Readln(F1,S);Writeln(F3,S);end;
Writeln(F3, IntToStr(Speed));
While not eof(F2) do begin;Readln(F2,S);Writeln(F3,S);end;

Re: Чтение и запись длинного текста

Добавлено: 23 янв 2007, 22:15
Колядин Максим

Код: Выделить всё

 Assign(F1,'before.txt');
Reset(F1);
Assign(F2, 'after.txt');
Reset(F2);
Assign(F3, 'answ.txt');
Rewrite(F3);
While not eof(F1) do begin;Readln(F1,S);Writeln(F3,S);end;
Writeln(F3, IntToStr(Speed));
While not eof(F2) do begin;Readln(F2,S);Writeln(F3,S);end;
Да, придумано логично! Спасибо, этому ты меня научил, но вот сделать не создавая для этого новые файлы - я так и не понял.
Нам уже известно, что позиция speed заканчивается на 1005-м символе. Зачем 2-й раздел)); Ну, позицию speed нашли, а как создать строку, содержащюю всё до speed, если максимальный размер строки - 128 символов. И как искать позиции я тоже не знаю. Поэтому, поясни мне, пожалуйста.
_______________
Я хотел бы ещё кон-что спросить:
1) Как создать новый файл, содержащий в своём имени более 1-й точки? (например "myinfo.129.001.txt"). При попытке создать такого типа файл возникает ошибка - File not found.
2) Как искать позиции в тексте?

Большое спасибо, что помогаете мне!

Re: Чтение и запись длинного текста

Добавлено: 24 янв 2007, 11:26
Игорь Акопян
зачем же всё-таки объединять под одним названием кучу впоросов???

по существу у меня тоже вопрос ;)
уже есть файл в этом формате, и тебе надо общаться именно с ним?

ЗЫ. Если есть доступ к человеку, придумавшему такой формат для хранения данных - скажи ему какую-нибудь гадость ;)