Помогите найти ошибку. Макс 123 кбайт

Модератор: Модераторы

Помогите найти ошибку. Макс 123 кбайт

Сообщение narevich » 31.05.2014 16:24:04

Всем привет. Помогите найти ошибку.
На вход подается текстовый файл. Суть: находим определенную строчку в файле, в ней находим нужное число и (после преобразования) выводим в текстовый файл. Проблема: В не зависимости от размера входного файла, на выходе не более 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.
narevich
незнакомец
 
Сообщения: 2
Зарегистрирован: 31.05.2014 16:04:27

Re: Помогите найти ошибку. Макс 123 кбайт

Сообщение скалогрыз » 01.06.2014 06:35:24

Пожалуйста подравь своё сообщение добавив тэг [code] перед началом и по завершению кода.
примерно так
[code]
for i:=1 to 10 do
writeln(1);
[/code]

и ещё. Тут отвечают довольно медленно. Если у тебя есть аккаунт на mail.ru, то там есть такой Женёк Мастер. Он собственно всегда охотно, а главное, быстро, помогает.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Помогите найти ошибку. Макс 123 кбайт

Сообщение mig-31 » 01.06.2014 11:53:02

Какая ОС? Вроде бы в Вин9х и ДОС было ограничение на размер файла.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Помогите найти ошибку. Макс 123 кбайт

Сообщение narevich » 01.06.2014 14:56:36

Пробовал на 3 ПК с разными ОС(хр и 7). Пробовал разными программами(borland, turbo,free). Везде одинаково
narevich
незнакомец
 
Сообщения: 2
Зарегистрирован: 31.05.2014 16:04:27

Re: Помогите найти ошибку. Макс 123 кбайт

Сообщение Sergei I. Gorelkin » 01.06.2014 15:47:01

Ограничения на размер файла нет. Но нужно учитывать, что по умолчанию тип string ограничен 255 символами, а тип integer имеет диапазон -32768..32767.
Невооруженным глазом каких-то ошибок в программе не видно, но, с другой стороны, отсутствует какая-либо обработка возможных ошибочных ситуаций , а она могла бы помочь. Например, уместно после val(s,v,code) проверять code на равенство нулю, а также проверять ошибки ввода-вывода, добавив {$I+} в начале.
Кроме того, лучше убрать модуль crt и вызов clrscr (можно будет добавить обратно, когда заработает), а в целях отладки выводить полученные строки не в файл, а на экран, тогда последняя напечатанная строка могла бы навести на нужные размышления (при выводе в файл имеет место буферизация, и последняя строка может быть не той, что на самом деле вывела программа).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Помогите найти ошибку. Макс 123 кбайт

Сообщение скалогрыз » 01.06.2014 17:35:10

narevich, попробуй такой код
Код: Выделить всё
var
i : integer;
f2 : text;
begin
  assign(f2, 'bigfile.txt'); {Связываем имя файла с файловым указателем f2}
  rewrite(f2);
  for i:=0 to 1024*64-1 do
    write(f2, 'abcd');
  close(f2);
end.

какой итоговый размер файла получится?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Помогите найти ошибку. Макс 123 кбайт

Сообщение SSerge » 02.06.2014 08:25:56

narevich, если в текстовом файле встречается символ с кодом ^Z (EOF), вся информация после этого символа при чтении будет проигнорирована. А символ этот может встретиться запросто - или из-за повреждения файла, или из-за копирования слиянием; если создается каким - то навигатором - и навигатор им может файл украсить.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул


Вернуться в Помощь за вознаграждение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru