Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Yourk
0 / 0 / 0
Регистрация: 19.03.2010
Сообщений: 9

Забавная ошибка с файлами

05.04.2010, 13:45. Показов 1031. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Писал на днях лабу, и наткнулся на ошибку, которую никак не могу понять. Надеюсь на вашу помощь.
Задание: Дан file of integer, нужно удалить поторяющиеся элементы.
Попытка реализовать:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 Procedure delete(var f:fl);
 var z,q,k,s,i,x,buf:integer; 
 begin
  assign(f,'files');
  reset(f);
  while not eof(f) do
   begin
    read(f,buf);
    q:=filepos(f);
    seek(f,0);
    z:=0;
    s:=0;
    while not(eof(f)) do
    begin
     read(f,x);
     if x=buf then z:=z+1;{проверка на то, что элемент встречается 1-ый раз}
     if (x=buf) and (z<>1) then i:=i+1 {если элементы равны и это не первая встреча, то увеличиваем счётчик}
     else
     begin
      k:=filepos(f);
      seek(f,k-1-i);
      write(f,x);{в этом месте и происходит ошибка}
      seek(f,k);
     end;
    end;
    seek(f,filepos(f) - i);
    truncate(f);
    seek(f,q);
   end;
   close(f);
  end;
Задумка следущая: в первом цикле - считываем элемент из файла, заходим во второй цикл и сравниваем этот элемент со всеми элементами файла, если совпадает, и это не первое совпадение - увеличиваем счётчик, если же не совпадает или это первое вхождение, то записываем элемент считанный во втором цикле на позицию k-1-i. Выходим из второго цикла, обрезаем файл, на количество повторяющихся элементов, ставим указатель файла на следущий элемент.

Суть ошибки в том, что когда он доходит до процедуры write(f,x), то на ней он зацикливается, и начинает увеличивать файл, пока не доходит до размера - 4 Gb ))
Буду очень признателен, если поможете.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2010, 13:45
Ответы с готовыми решениями:

забавная штука
на http://www.me-corporate.ru/ главная страница выпала примерно 2 недели назад сразу и на яндексе и на рамблере написал письмо в...

Забавная неисправность
У меня вот такая проблема, если отойти от компа, на минут 5, то когда прикасаешься к мышке, она отключается, со звуком отключения...

забавная вещь
http://www.yandex.ru/yandsearch?text=%F5%F3%E9&amp;clid=9582 Запрос не совсем приличный. Прошу обратить внимание на 5 позицию выдачи. ...

11
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
05.04.2010, 14:29
а чего вы мучаетесь?
Откройте его 2 раза. и все. в первом открытии берете строку для сравнения, а во втором - строки под сравнения

Добавлено через 2 минуты
Это будут независимые потоки.
Второе открытие можете вообще функцие оформить (true/false) т.е. есть совпадения или нет

Function Sovpad (iskomoe:integer):boolean;
begin
открываем этот же файл на reset(f);
и сканим на совпадение на ch
end;
0
 Аватар для Yourk
0 / 0 / 0
Регистрация: 19.03.2010
Сообщений: 9
05.04.2010, 14:30  [ТС]
"Открыть два раза" - это всмысле под один файл две файловых переменных ?
Там уточнение - нового файла не заводить.
0
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
05.04.2010, 14:34
А вы и не заводите новый файл. Вы работает с 1. Просто 2 файловые переменные.
Ограничения на кол-во переменных надеюсь нет?)
0
 Аватар для Yourk
0 / 0 / 0
Регистрация: 19.03.2010
Сообщений: 9
05.04.2010, 14:40  [ТС]
А это будет не одно и тоже, с тем, что я написал ?

Добавлено через 3 минуты
да, понял, не одно и тоже. Но не я не много не представляю, как с ними работать. Не могли бы разъяснить по подробней? (всмысле операция сравнения)

Добавлено через 32 секунды
Нет, на кол-во перменных ограничение отсутствует.
0
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
05.04.2010, 14:47
Цитата Сообщение от Yourk Посмотреть сообщение
assign(f,'files');
reset(f);
while not eof(f) do
begin
read(f,buf);
вот вы прочитали текущую строку. Вам надо её сравнить. Отсылаем её на сравнение в функцию
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function Sovpad (iskomoe:integer):boolean;
var f1:fl;     
     ch1:integer;
begin
   Sovpad:=false;
  assign(f1,'files');
  reset(f1);
  while not eof(f1) do
    begin  
      read(f,ch1);
      if ch1=iskomoe then 
          begin             
             Sovpad:=true;
             break;
          end;
    end;    
end;
0
 Аватар для Yourk
0 / 0 / 0
Регистрация: 19.03.2010
Сообщений: 9
05.04.2010, 14:58  [ТС]
А, понятно, но тогда функцию, надо дополнить условием что это не первое совпадение ch1 и iskomoe, иначе он будет сравнивать одни и те же элементы и говорить что они равны. Верно ?
Пойду попробую написать.
0
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
05.04.2010, 15:02
Вот вам еще советик:
вы можете не просто найти совпадения, но и запихнуть их в массив или текстовую переменную, что позволит вам создать массив удаляемых элементов. А содержать массив будет именно значение функции filepos(f1);
0
 Аватар для Yourk
0 / 0 / 0
Регистрация: 19.03.2010
Сообщений: 9
05.04.2010, 15:12  [ТС]
А такой вопрос, указатели файлов f1 и f - совпадают ? То есть когда я считываю элементы из файла f1, указатель в файле f - перемещается ?
0
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
05.04.2010, 15:13
не должно
0
 Аватар для Yourk
0 / 0 / 0
Регистрация: 19.03.2010
Сообщений: 9
06.04.2010, 00:25  [ТС]
Понятно, спасибо
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
06.04.2010, 07:08
Все намного проще, все за один проход по файлу, без всяких массивов, вот пример, оформите как процедуру.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
uses crt;
var s,c,c1:integer;
    f:file of integer;
    n,i,j,k,l:integer;
begin
clrscr;
assign(f,'file1');
rewrite(f);
write('Количество чисел n=');
readln(n);
for i:=1 to n do
 begin
  s:=random(10);
  write(f,s);
 end;
clrscr;
writeln('Исходный файл:');
reset(f);
while not eof(f) do
 begin
  read(f,s);
  write(s,' ');
 end;
writeln;
close(f);
reset(f);
k:=0;i:=0;
while i <= filesize(f)-1 do
  begin
  seek(f,i);
  read(f,s);
  j:=i+1;
  while j <=filesize(f)-1-k do
   begin
     seek(f,j);
     read(f,c);
     if c=s then
      begin
       k:=k+1;
       for l:=j to filesize(f)-2 do
        begin
         seek(f,l+1);
         read(f,c1);
         seek(f,l);
         write(f,c1);
        end;
      end
     else j:=j+1;
    end;
   i:=i+1;
 end;
seek(f,filesize(f)-k);
truncate(f);
close(f);
writeln('Измененный файл:');
reset(f);
for i:=0 to filesize(f)-1 do
 begin
  read(f,s);
  write(s,' ');
 end;
close(f);
readln
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2010, 07:08
Помогаю со студенческими работами здесь

Забавная кнопка
Делая галерею появилась идея создать кнопку переключения изображений следующего вида: в состоянии неактивности имеет вид nextButton.png при...

Забавная фича C++ Builder 6
Может, я не первый, кто это открыл, но сегодня я кое-что выяснил. Рассмотрим код #include &lt;iostream.h&gt; #include...

Забавная путаница моего ноутбука
Всем добрый вечер, столкнулся с такой бредовой ситуацией-включаю компьютер вижу идет загрузка , символика windows, и на моменте ввода...

Забавная генерация ссылки с @Html.ActionLink()
Доброго времени суток, форумчане. Заметил интересную особенность. Если хочу сгенерировать ссылку на существующий метод контроллера,...

Забавная идейка по реализации мелкого чат бота
Всем доброго времени суток. Решил помочь девушке для зачета выполнить её задания и что-то меня по старой памяти затянуло) Появилась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru