Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Добавление в фаил


Автор: SinSoul 7.6.2007, 01:56
Добрый день или вечер!
Я сделал игру на Паскале(курсовая), но появилась маленькая проблема. При завершении игры, лучшие 15 результатов добавляются в фаил. Проблема в том, что мне надо добавлять до или после лучшего результата, в зависимости от нового результата. Было несколько идей, но так ни одну и не смог воплотить. Сперва думал попробовать с функцией StrReplace() - не вышло, даже начать не смог. Второй вариант - считывать каждую линию, ввести в массив и потом сравнивать, но результат не далеко ушёл, т.к в файле не только integer типа данные.

Пример:
1. Игрок1 - 152
2. Игрок2 - 131
3. Игрок3 - 111

Новый игрок набрал 122, нужно вставить между 2 и 3 результатами.
Заранее благодарю.

_____
С уважением, Дмитрий.

Автор: Poseidon 7.6.2007, 02:45
Сделай формат файла такой:

Код

152 Игрок1
131 Игрок2
111 Игрок3


Загоняй весь файл в массив построчно (одна строка - один элемент массива), а так же добавляй новый результат. А потом сортируй массив и сохраняй заново.

PS. Результат обязательно хранить в текстовом файле?

Автор: SinSoul 7.6.2007, 02:58
Цитата(Poseidon @ 7.6.2007,  02:45)
PS. Результат обязательно хранить в текстовом файле?

А есть другой выбор?

Существует ли функция сортировки массива? В php есть, может и в паскале тоже есть? Или мне создать функцию проверки(сравнивания) каждого элемента массива? И ещё, 
Код

152 Игрок1
132 Игрок2
...

эти данные можно получить только string типа, возможно сравнивание числовых значений после этого?
Или я что-то не догоняю?
Благодарю за помощь!

Автор: _Dargin_ 7.6.2007, 09:59
Либо использовать записи - не подойдет, если файл должен кто-то видеть, 

или брать кусок файла после 2 строчки-> загонять его в TMemoryStream-> очистить содержимое файла Truncate(как-то так)-> добавлять строку-> обратно вписывать содержимое TMemoryStream

Изврат конечно.  smile 

Поиск чисел в тексте
Идя по каждой букве str:string проверяем
Код

var str,str2:string; i:word; answer:integer;

for i:= 1 to length(str) do
if (Ord(str[i])>47)and(Ord(str[i])<50) then str2:=str2+str[i];
answer:=StrToInt(str2);


Учитывая что пользователь может в нике указать цифры меняем код вот так:
Код

var str,str2:string; i:word; answer:integer;

for i:= 1 to length(str) do
if (Ord(str[i])>47)and(Ord(str[i])<50) then str2:=str2+str[i] else str2:='';
answer:=StrToInt(str2);

Считывается последние число, если в конце нет никаких символов.

Кстати в TurboPascal 7 могут быть проблемы с функцией StrToInt, поэтому советую использовать компиляторы типа TMTPascal.

Таким образом получаем число, а потом сортируем. и записываем в файл, если не устраивает первый вариант.

Надеюсь помог smile 

Автор: SinSoul 7.6.2007, 17:38
Цитата(_Dargin_ @ 7.6.2007,  09:59)
Либо использовать записи - не подойдет, если файл должен кто-то видеть, 

или брать кусок файла после 2 строчки-> загонять его в TMemoryStream-> очистить содержимое файла Truncate(как-то так)-> добавлять строку-> обратно вписывать содержимое TMemoryStream

Изврат конечно.  smile 

Поиск чисел в тексте
Идя по каждой букве str:string проверяем
Код

var str,str2:string; i:word; answer:integer;

for i:= 1 to length(str) do
if (Ord(str[i])>47)and(Ord(str[i])<50) then str2:=str2+str[i];
answer:=StrToInt(str2);


Учитывая что пользователь может в нике указать цифры меняем код вот так:
Код

var str,str2:string; i:word; answer:integer;

for i:= 1 to length(str) do
if (Ord(str[i])>47)and(Ord(str[i])<50) then str2:=str2+str[i] else str2:='';
answer:=StrToInt(str2);

Считывается последние число, если в конце нет никаких символов.

Кстати в TurboPascal 7 могут быть проблемы с функцией StrToInt, поэтому советую использовать компиляторы типа TMTPascal.

Таким образом получаем число, а потом сортируем. и записываем в файл, если не устраивает первый вариант.

Надеюсь помог smile

Да! Конечно помогли! Спасибо большое! А насчёт TMemoryStream, ну я не настолько хороший "Паскалист", первый раз в жизни слышу о таком smile, в любом случае большое спасибо!
P.S. пользователь не сможет ввести цифры в име, т.к. я сделал проверку на нажатые клавиши smile
Выглядит приблизительно вот так:
Код

USES crt;
var k         :char;
    name    :string;
    i       :integer;
const keysallowed: set of char = ['q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'];
begin
  name:='';
  {здесь можно начать цикл, например while k<>#13 do, тоесть имя будет пополнятся пока не нажмёте enter}
  {while k<>#13 do
    begin}
        if k=#8 then{здесь аналог обычному стиранию, то есть при нажатии backspace из переменной name будет стёрта последняя буква}
            begin
                i:=length(name);
                name[i]:=#0;
            end;
        k:=readkey;
        if (k in keysallowed) then
            name:=name+k;
    {end;}
  writeln(name);
  readln;
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)