Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2009, 17:50   #1
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию Логические ошибки в программе

Программа разбивает текст из текстового файла на куски определённого размера и сохраняет каждый кусок в отдельном файле.
Код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s,s1,s2:widestring;
  filename,i,k:string;
  f,t:textfile;
  l:integer;
begin
  s:='';
  assignfile(t,'c:\0.txt');
  reset(t);
  while not eof(t) do
  begin
  readln(t,s1);
  s:=s+s1;
  end;
  closefile(t);
  l:=2000;           
  filename:='c:\1.txt';
  i:='1';
  k:='';
  repeat
  begin
  s2:=copy(s,1,l);
  delete(s,1,l);
  assignfile(f,'filename');
  rewrite(f);
  write(f,s2);
  closefile(f);
  insert(i, filename, 4);      
  end;
  until s=k
end;
Файлы не появляются. Я думаю, что виноват либо repeat либо insert. Помогите.
hydrogen вне форума Ответить с цитированием
Старый 27.10.2009, 18:05   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

1)
Код:
 assignfile(f,'filename');
Без кавычек
2)Зачем Вам f и t? Используйте одну переменную, экономьте память.
3)Если в отдельном файле, то используйте счетчик, для смены имени файла:
Код:
filename:='C:/'+IntToStr(Count)+'.txt';
4)Зачем Вам k?
Код:
until s=''
5)Вы уверены, что у Вас в файле кол-во символов кратно 2000? С Delete, Copy и вылететь не долго.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 27.10.2009 в 18:09.
Alex Cones вне форума Ответить с цитированием
Старый 27.10.2009, 18:22   #3
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию

Спасибо. Ошибка глупая.
Можно по подробнее, со счетчиком файлов?
Код:
filename:='C:/'+IntToStr(Count)+'.txt';
я так понимаю, что 'C:/' и '.txt' остаются неизменными, а вот IntToStr(Count) как работает?
hydrogen вне форума Ответить с цитированием
Старый 27.10.2009, 18:29   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Представьте, что у вас есть переменная I:Integer.
Она числового типа.
Если Вы вставите её напрямую в
Код:
filename:='C:/'+I+'.txt';
То компилятор выдаст ошибку: "несовместимые типы: Integer и String"
Для того, чтобы вставить Integer в String необходимо преобразовать значение:
Код:
IntToStr(I)
Обратно перевести тоже легко, к примеру у вас есть такая конструкция:
Код:
S:String;
S:='123';
Возникает вопрос, как присвоить это значение переменной типа Integer? Да очень просто:
Код:
I:=StrToInt(S);
Таких функций для преобразования типов достаточно много.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 27.10.2009, 18:46   #5
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию

да точно? вспомнил.
Я вместо I поставил 1 и он у меня сохраняет только один файл с именем 1.
hydrogen вне форума Ответить с цитированием
Старый 27.10.2009, 22:26   #6
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию

Программа должна разбивать текст из файла 0.txt на куски размером в интервале от l1 до l2 и сохранять их в файлах. Тут логическая ошибка: он сохраняет не в этом интервале, а как то вылезает из интервала. Помогите.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s,s1,s2:widestring;
  p,st:string;
  f,t:textfile;
  l,l1,l2,y,x,d,v,k:integer;
begin
  l1:=strtoint(edit1.Text);
  l2:=strtoint(edit2.Text);
  d:=l2-l1;
  s:='';
  assignfile(t,'c:\0.txt');
  reset(t);
  while not eof(t) do
  begin
  readln(t,s1);
  s:=s+s1;
  end;
  closefile(t);
  x:=0;
  repeat
  begin
  v:=random(d);
  k:=l1+v;
  x:=x+1;
  p:=copy(s,k,1000);
  y:=pos('.',p);
  l:=k+y;
  s2:=copy(s,1,l);
  delete(s,1,l);
  assignfile(f,'c:\'+IntToStr(x)+'.txt');
  rewrite(f);
  write(f,s2);
  closefile(f);
  end;
  until s=''
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.close;
end;

Последний раз редактировалось hydrogen; 27.10.2009 в 23:25.
hydrogen вне форума Ответить с цитированием
Старый 28.10.2009, 00:55   #7
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию

Я понял проблему! Это все кодировка виновата. У меня текст русский в кодировки utf8. Надо, чтобы он правильно считал.
hydrogen вне форума Ответить с цитированием
Старый 28.10.2009, 01:14   #8
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию

Всё разобрался . Надо сохранять в кодировки ANSI 1251, тогда все пашет.
Всем спасибо.

Последний раз редактировалось hydrogen; 28.10.2009 в 01:17.
hydrogen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите Исправить Ошибки в Программе Maxim_Burea Помощь студентам 5 26.09.2009 22:54
Помогите исправить ошибки в программе rar14 Общие вопросы C/C++ 1 20.04.2009 19:07
Ошибки в программе(visual c+++) JOFRIF Visual C++ 6 23.08.2008 16:20
помогите исправить ошибки в программе... VDK23 Помощь студентам 1 17.04.2008 13:05
Помогите исправить ошибки в программе Gambit90 Помощь студентам 1 20.12.2007 16:24