На вход подается текстовый файл. Суть: находим определенную строчку в файле, в ней находим нужное число и (после преобразования) выводим в текстовый файл. Проблема: В не зависимости от размера входного файла, на выходе не более 64 кбайт. Как я понимаю 64- макс размер буфера. Ошибки нигде не вижу. Посмотрите пожалуйста
- Код: Выделить всё
uses crt;
var
latitude, longitude, PDOP, VDOP, HDOP : real;
buflen, i,j, commas, commapos, k, m, next_comma : integer;
buf, status : string;
output, vspom : string;
first, second : real;
f1, f2 : text;
begin
clrscr;
writeln('Enter filename to read'); {Запрос на ввод имени исходного лог-файла}
readln(buf); {Читаем имя файла с клавиатуры}
assign(f1, buf); {Связываем имя файла с файловым указателем f1}
reset(f1); {Открываем файл для чтения}
writeln('Enter output filename'); {Запрос на ввод имени выходного файла}
readln(buf); {Читаем имя файла с клавиатуры}
assign(f2, buf); {Связываем имя файла с файловым указателем f2}
rewrite(f2); {Создаем файл на диске и открываем его для записи}
{Цикл пока не достигнут конец файла или не нажата любая клавиша}
while (not eof(f1)) and (not keypressed) do
begin
readln(f1,buf); {Читаем очередную строку из лог-файла}
buflen := length (buf); {Запоминаем длину считанной строки}
{Если в строке buf есть подстрока с символами RMC, то ...}
if pos('RMC', buf) <> 0 then
{******************************************************************************}
{************************Анализ предложения RMC********************************}
{******************************************************************************}
begin
{writeln(f2,buf);}
commas := 0;
commapos := 0;
for i:=1 to buflen do {Проверка всех символов в буфере}
begin
if buf[i] = ',' then {Если встретилась запятая, то ...}
begin
{запоминаем общее количество найденных запятых в строке buf}
inc (commas);
{запоминаем позицию, где встретилась очередная запятая}
commapos := i;
{если количество запятых равно 3 и поле после запятой не пустое, то там содержится информация о широте}
if (commas = 3) and (buf[commapos + 1] <> ',') then
begin
{Вычисляем позицию следующей запятой}
next_comma := commapos + 1;
while buf[next_comma] <> ',' do inc(next_comma); {Цикл, пока не встретится следующая запятая}
output := buf; {копируем содержимое строки buf в строку output}
{удаляем из строки output всю лишнюю информацию, кроме широты}
delete(output,next_comma,buflen);
delete(output,1,commapos);
{удаляем в строке output поля, отведенные для записи}
{целого числа градусов, чтобы вычислить минуты}
delete(output,1,2);
{преобразуем строку output в число second}
val (output, second, m);
{переводим минуты в градусы}
second := second/60.0;
output := buf; {снова копируем содержимое строки buf в строку output}
{удаляем из строки output всю лишнюю информацию, кроме широты}
delete(output,next_comma,buflen);
delete(output,1,commapos);
{удаляем в строке output поля, отведенные для}
{записи минут, чтобы вычислить целое число градусов}
delete(output, 3, buflen);
{Преобразуем строку output в число first}
val(output, first,m); {число first - целая часть градусов}
{складываем целую часть градусов с минутами,}
{переведенными в градусы и получаем значение широты}
latitude := first + second;
write(f2,latitude:2:10,' '); {выводим значение широты в файл}
end;
{если количество запятых равно 5 и поле после запятой не пустое, то там содержится информация о долготе}
if (commas = 5) and (buf[commapos + 1] <> ',') then
begin
{Вычисляем позицию следующей запятой}
next_comma := commapos + 1;
while buf[next_comma] <> ',' do inc(next_comma); {Цикл, пока не встретится следующая запятая}
output := buf; {копируем содержимое строки buf в строку output,}
{удаляем из строки output всю лишнюю информацию, кроме долготы}
delete(output,next_comma,buflen);
delete(output,1,commapos);
{удаляем в строке output поля, отведенные для записи}
{целого числа градусов, чтобы вычислить минуты}
delete(output,1,3);
{преобразуем строку output в число second}
val (output, second, m);
{переводим минуты в градусы}
second := second/60.0;
output := buf; {снова копируем содержимое строки buf в строку output}
{удаляем из строки output всю лишнюю информацию, кроме долготы}
delete(output,next_comma,buflen);
delete(output,1,commapos);
{удаляем в строке output поля, отведенные для}
{записи минут, чтобы вычислить целое число градусов}
delete(output, 4, buflen);
{Преобразуем строку output в число first}
val(output, first,m); {число first - целая часть градусов}
{складываем целую часть градусов с минутами,}
{переведенными в градусы и получаем значение долготы}
longitude := first + second;
write(f2,longitude:2:10,' '); {Выводим в файл}
end;
end;
end;
writeln(f2); {Перевод строки в файле}
end;
end;
close(f1);
close(f2);
end.