PDA

Показать полную графическую версию : [решено] Сравнение файлов.


Snake750
12-03-2010, 18:47
Доброго времени суток.Подскажите пожалуйста как реализовать вот такую штуку:
Имеются 2 файла в которых содержится вот такая информация (на фото )
http://forum.oszone.net/attachment.php?attachmentid=41366&stc=1&d=1268408564

Программа должна сравнивать эти 2 фаила а именно:в обоих файлах есть 4 числа:x, y, r, q.Сначала нужно сравнить х и у и если они равны то проверить равность q и r. Смысл в том что если эти числа не равны то программа должна вывести комбинацию (x,y,r,q).

У меня встала загвозка при считывании значении с файла.Как считать со строки сразу 4 значение?
Приведу пример
50(пробел) 1 (пробел) 50 (пробел)0
Необходимо считать числа этой строки в переменные x,y,r,q;
И так проделать для всех строк.Я знаю как считать до пробела а вот как после него считать не знаю.

Serega
13-03-2010, 00:37
Snake750, не совсем понятно, что конкретно вам надо.
Обрабатывать текстовый файл можно как угодно, читать его построчно, прочитать весь файл как одну строку, прочитать файл в массив символов, как массив байт...
Как бы привести скриншоты, это хорошо, но что дальше? Ну сравнили файлы, записать результат сравнения в третий файл? Вывести на экран сообщение? или что-то ещё...
Вот, накидал вам простой пример обработки текстового файла с последующим заполнением его в ListView.

Snake750
13-03-2010, 01:41
Serega,Имеется программа1 в которую я ввожу исходные данные (х и у) и получаю результат (r и q.)
Эта программа записывает эти значения в файл1 вот в таком ввиде
x(пробел) y(пробел) r(пробел) q(пробел)
Для лучшего понимания предоставлю таблицу наборов тестов

Входные данные Результат
(x,y) (r,q)
0,1 0,0
0,9999999 0,0
9999999,1 9999999,1
0,50 0,0
50,1 50,0
0,0 error
1,99999991 error


При данном наборе тестов в файл1 будет записано:


0 1 0.0000000000000000E+0000 0.0000000000000000E+0000
0 9999999 0.0000000000000000E+0000 0.0000000000000000E+0000
9999999 1 9.9999900000000E+0007 0.0000000000000000E+0000
0 50 0.0000000000000000E+0000 0.0000000000000000E+0000
50 1 5.0000000000E+0001 0.0000000000000000E+0000
0 0 error
1 99999991 error
Слово "error" означает что введен некорректный набор тестов(например при наборе 0,0 в программе происходит деление на 0) по этому результатом работы программы на таком наборе х,у будет слово "error"
Программа расчитана на работу с числами и если ввести вместо х или у какой-либо символ(пусть будет "А") то программа запишет в файл такую комбинацию:
1 A error

Во второй файл я записываю тоже самое но не через программу а вручную.

0 1 00
0 9999999 0 0
9999999 1 9999999 1
0 50 0 0
50 1 50 0
0 0 error
1 99999991 error

А потом программа должна сравить х1 и x2 и у1 и у2(где,x1-значение x1 из файла1, x2-значение x2 из файла2 и т.д) .
Если они равны то:
Если Е(епсилан вводится с клавиатуры)<=|r1-r2| (где,r1-значение r1 из файла1, r2-значение r2 из файла2) тогда
Если Е(епсилан вводится с клавиатуры)<=|q1-q2| (где,q1-значение q1 из файла1, q2-значение q2 из файла2) тогда к SC (количеству совпавших комбинация):=SC+1
иначе SC (количеству совпавших комбинация):=SC и вывести на экран комбинацию х у r q на которых произошло несовпадение
Если r и q не равны то вывести на экран количество не совпавших комбинация r и q
Приведу пример:
В файле1 содержится информация вида
0 1 0.0000000000000000E+0000 0.0000000000000000E+0000
0 9999999 0.0000000000000000E+0000 0.0000000000000000E+0000
9999999 1 9.9999900000000E+0007 0.0000000000000000E+0000
0 50 0.0000000000000000E+0000 0.0000000000000000E+0000
50 1 5.0000000000E+0001 0.0000000000000000E+0000
0 0 error
1 99999991 error
В файле2 вида:

0 2 0 0
0 9999999 0 0
9999999 1 9999999 1
0 50 0 0
50 1 50 0
0 0 error
1 99999991 error
Программа сравнивает файл1 и файл2.
x1=0 y1=1 r1=0.0000000000000000E+0000 q1=0.0000000000000000E+0000
x2=0 y2=2 r1=0 q1=0
Так как y1 и у2 не равны программа выводит на экран комбинацию
0 2 0 0
И количество совпадений SC будет равно 6,так как всего наборов было 7 и один из них не совпал.
Я понятно объяснил что делает программа?

Serega
13-03-2010, 22:11
Я понятно объяснил что делает программа? »
Вполне, т.е. вы мне предлагаете написать за вас программу? Тогда вы не по адресу, вы спросили:
Как считать со строки сразу 4 значение? »
Я вам привёл пример обработки текстового файла.
Как вариант, могу вам подсказать, сначала читайте целиком строку из первого файла, затем строку из второго файла, производите обработку строки из первого, затем обработку строки из второго файла. При сравнении используйте StrToInt, предварительно проверив, что ваше значение не слово error.

Snake750
13-03-2010, 22:39
Serega, нет.Я не прошу сделать за меня все.Подскажите как считать 4 параметра со строки в массивы x[i],y[i],q[i],r[i] и все.Можно прямо тут кодом.Я расспасал как работает программа для того чтобы вам было понятнее для чего мне необходимо считать параметры

И лучще всего чтобы этот маленький кусочек кода был написан не конкретно под Делфи,а его можно было запустить на простом Паскале.(без привязки к компоненатам делфи а простыми процедурами обычного Паскаля)

Snake750
14-03-2010, 22:43
Господа форумчане.Ни у что никто не знает как считать 4 параметра из строчки в массивы

Serega
15-03-2010, 00:42
Подскажите как считать 4 параметра со строки в массивы x[i],y[i],q[i],r[i] и все. »
Мне кажется лучше считать весь файл в матрицу, пример:

type
TMatrixRow = array of Integer;
TMatrix = array of TMatrixRow;

procedure FillingOfMatrix(const FileName: string; var Matrix: TMatrix);
var
txt: TextFile;
tmp: string;
pos_simbol, row, col, value, e: Integer;
begin
AssignFile(txt, FileName); Reset(txt);
row:= 0;
while not Eof(txt) do
begin
col:= 0;
SetLength(Matrix, row+1, 4);
Readln(txt, tmp); // читаем строку
repeat
while (tmp <> '') and (tmp[1] = ' ') do Delete(tmp, 1, 1); // удаляем пробелы в начале строки, если есть
if tmp <> '' then // если строка не пустая, то
begin
pos_simbol:= Pos(' ', tmp); // определяем расположение пробела
if pos_simbol = 0 then
begin
pos_simbol:= Length(tmp); // если пробелов не осталось, то берём всю длину строки
Val(Copy(tmp, 1, pos_simbol), value, e);
end
else Val(Copy(tmp, 1, pos_simbol-1), value, e);
Matrix[row, col]:= value; // задаём значение
Delete(tmp, 1, pos_simbol); // удаляем до пробела
Inc(col); // увеличиваем счётчик столбцов
end;
until tmp = '';
Inc(row); // увеличиваем счётчик строк
end;
CloseFile(txt);
end;

P.S.
Единственное забыл добавить проверку на слово error.




© OSzone.net 2001-2012