|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка "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
|
||||
|
||||
А память под динамический массив кто выделять будет, Пушкин?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Научите как?
|
#4
|
||||
|
||||
и что это такое?
новый велосипед на тему? 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
|
|||
|
|||
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
|
|||
|
|||
Что я делаю не правильно?
Подскажите в какую сторону копать?
Что я делаю не правильно? и при работе с динамическими массивами Если Код:
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
|
|||
|
|||
Спасибо. Учту на будущее... Я всётаки ушёл от создания массивов, поскольку на 10-ти гигабайтные файлы никакой памяти не хватит... Написал побайтную обработку без проблем... Теперь встала другая проблема... Как можно возвести число 255 в степень 255? Ни в какой тип данных не помещается...
|