Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2010, 22:46
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
Вопрос Ошибка "Stream read error"

Помогите разобраться с ошибкой чтения из потока. Компилятор пропускает, но при нажатии на кнопку прога падает. Методом перебора определил, что ошибка возникает при большом размере массива. Мне нужен неограниченный размер потока. Что не так делаю?
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var f1,f2:File;
    s1,s2:string;
    Streaml, Stream2: TFileStream;
    IntBuf: array of byte;                             // если пишу так - ошибка "Stream read error"
               //  IntBuf: array [0..255] of byte;  // если пишу так -  ошибка        
               //  IntBuf: array [0..64] of byte;   // РАБОТАЕТ! Но этого мало, мне нужно неограниченный размер потока!
begin
 s1:=edit1.Text;
 s2:=edit2.Text;
 AssignFile(f1,s1);
 AssignFile(f2,s2);
  try
   Streaml := TFileStream.Create(s2, fmOpenRead);
   Streaml.ReadBuffer(IntBuf, SizeOf(IntBuf));
    try
     Stream2 := TFileStream.Create(s1, fmOpenWrite or fmCreate);
     Stream2.Seek(0, soFromEnd);
     Stream2.WriteBuffer(IntBuf, SizeOf(IntBuf));
    finally
     Stream2.Free;
    end;
  finally
   Streaml.Free;
  end;
 Showmessage ('Успешно!');
end;
Ответить с цитированием
  #2  
Старый 17.12.2010, 05:13
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А память под динамический массив кто выделять будет, Пушкин?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 17.12.2010, 07:21
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

Научите как?
Ответить с цитированием
  #4  
Старый 17.12.2010, 15:31
Аватар для MMM_Corp
MMM_Corp MMM_Corp вне форума
Прохожий
 
Регистрация: 12.12.2010
Сообщения: 37
Репутация: 13
По умолчанию

и что это такое?
новый велосипед на тему? CopyFile, вообщето есть такая команда, юзайте ее)

итак.
1. AssignFile(f1,s1); - что это за бредятина? она для TFileStream вовек не нужна, чтото с паскалем напутали
2. TFileStream; - вот это стрим!, а IntBuf: array [0..64] of byte; - буфер, не мешайте все в кашу, а то описание одно, а код совсем другой!
3. И нормальные люди пишут:
Код:
 IntBuf: array of byte;
.
.
.
SetLength(IntBuf, GetFreemem....)
// готовый код не дам, сами подумайте что я такое написал, иначе так и не поймёте в чем ошибка
4. у вас в коде явная утечка связана с AssignFile(f1,s1);, на утечки вам плевать? не боитесь что юзери побьют?)
Ответить с цитированием
  #5  
Старый 17.12.2010, 23:27
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

MMM_Corp, я не изобретаю велосипед и копировать файлы не проблема, я просто упрощаю код, в реале будет:
1. Считать поток
2. Изменить/обработать
3. Записать новый поток
Просто на данном этапе хочу получить хотя бы простое копирование потоков неограниченных размеров. (Я с потоками первый раз работаю, да и вообще не могу себя причислить к опытным программистам, всё с чего-то учатся, так что не бейте сильно и не посылайте в гугл... там я в первую очередь ищу (вру, я Нигмой пользуюсь), а форумы это последняя стадия...)
Далее по порядку:
1. AssignFile у меня остался с предыдущего варианта считывания информации из файла, я пробовал считывать построчно обычными средствами, но потом отказался от этого способа и решил читать потоки... Не думал, что это может навредить, поэтому оставил, спасибо за подсказку, убрал и буду иметь ввиду в будущем, однако пользы от этого не заметил...
2. IntBuf: array [0..64] of byte от этого варианта я отказался... просто в коменте к коду приводил варианты которые я пробовал... конечный вариант конечно IntBuf: array of byte...
Мне обязательно нужно побайтно считать в массив, чтобы отдельные элементы можно было редактировать и потом из этого массива сделать новый поток...
3. Готовый код я и не прошу... Прошу лишь дать вектор поиска (что вы собственно и сделали)... мне самому интересно разобраться, а не свалить свою задачу кому-либо на плечи... Что такое GetFreemem я так и не нашел... Есть Getmem и Freemem, но они не могут быть аргументами у SetLength... компилятор визжит матюками... Поэтому пробовал их реализовать отдельно:

Код:
procedure TForm1.Button1Click(Sender: TObject);
Var s1,s2,v:string;
      i:integer;
      Streaml, Stream2: TFileStream;
      IntBuf: array of byte;
begin
  s1:=edit1.Text;
  s2:=edit2.Text;
 Showmessage (inttostr(Length(IntBuf)));               //проверяю начальную длину массива (0)
  try
   Streaml := TFileStream.Create(s2, fmOpenRead);  //создаю поток из первого файла
   GetMem(IntBuf, Streaml.Size);                           //Выделяю память для массива IntBuf размером равным размеру потока
   SetLength(IntBuf, Streaml.Size);                        //устанавливаю длину массива равную длине потока
   Showmessage (inttostr(Streaml.Size));                //проверяю длину потока (344)
   Showmessage (inttostr(Length(IntBuf)));             //проверяю длину массива (такая же как длинна потока - 344)
   i:=Length(IntBuf);                                            //присваиваю переменной значение длинны массива, поскольку в Streaml.ReadBuffer не принимает как аргумент Length(IntBuf)
   Streaml.ReadBuffer(IntBuf, i);                             //читаю поток в массив
   Showmessage (inttostr(SizeOf(IntBuf)));              //проверяю размер массива, выдает (4) ??? (а длинна 344!!!)
     try
      i:=Length(IntBuf);
      Stream2 := TFileStream.Create(s1, fmOpenWrite or fmCreate);  //создаю второй поток
      Stream2.Seek(0, soFromEnd);                                              //позиция в конец
      Stream2.WriteBuffer(IntBuf, i);                                             //записываю в поток из массива
     finally
      Stream2.Free;
     end;
    finally
     Streaml.Free;
     FreeMem(IntBuf);                                                               //освобождаю память
 end;
 Showmessage ('Успешно!');
end;

Результат: выводятся все шоумеседжи до Showmessage (inttostr(SizeOf(IntBuf))); включительно и выдает ошибку Аксесс Виолейшн...
Подскажите в какую сторону копать?
Что я делаю не правильно?
Почему Длинна массива 344, а размер массива 4?

Последний раз редактировалось d_e_x_t_e_r, 18.12.2010 в 11:33.
Ответить с цитированием
  #6  
Старый 20.12.2010, 11:13
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию Что я делаю не правильно?

Подскажите в какую сторону копать?
Что я делаю не правильно?

и при работе с динамическими массивами
Если
Код:
      IntBuf: array of byte;
то читать и писать нужно так
Код:
   Streaml.ReadBuffer(IntBuf[0], i); //читаю поток в 
и
Код:
      Stream2.WriteBuffer(IntBuf[0], i);   //записываю в поток из массива

и не
Код:
   Showmessage (inttostr(SizeOf(IntBuf)));              //проверяю размер массива, выдает (4) ??? (а длинна 344!!!)
а
Код:
   Showmessage (inttostr(Length(IntBuf)));

И кроме того, вот этого
Код:
     FreeMem(IntBuf);  //освобождаю память
 end;
делать ни в коем случае нельзя.
используйте SetLength(,0) , если очень хочется, но при выходе из процедуры, в которой описан массив, он освободится автоматически.
Ответить с цитированием
  #7  
Старый 21.12.2010, 12:44
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

Спасибо. Учту на будущее... Я всётаки ушёл от создания массивов, поскольку на 10-ти гигабайтные файлы никакой памяти не хватит... Написал побайтную обработку без проблем... Теперь встала другая проблема... Как можно возвести число 255 в степень 255? Ни в какой тип данных не помещается...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter