Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как загрузить TFileStream в RawByteString? 
V
    Опции темы
ZVano
Дата 23.5.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Есть файл, содержимое которого нужно считать в переменную типа RawByteString.
Как это сделать?

Мой код такой:
Код

filePath = "..\\img\\myImage.jpg";
TFileStream * imgStream = new TFileStream(filePath, fmOpenRead);
try {
  RawByteString imgRaw;
  imgRaw.SetLength(imgStream->Size);// imgStream->Size --- 77 040 байт
  imgStream->Position = 0;
  imgStream->Read(&imgRaw, imgStream->Size);
  // imgRaw --- '\0' 0 (0x00)
}
__finally {
  imgStream->Free();
}


При выполнении ошибки не происходит, но и содержимое переменной imgRaw пустое.
Может, RawByteString не может хранить данных такого размера(77 040)?
В модуле <System.hpp> тип объявлен так:
Код

typedef AnsiStringT<65535> RawByteString;




--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Alexeis
Дата 23.5.2011, 14:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



ZVano, 
Код

imgStream->Read(&imgRaw, imgStream->Size);

Такая строка является объектом. Нельзя данные писать напрямую в объект. Можно писать в буфер заданного размера. 

Я бы воспользовался классом TStringStream . ИМХО он лучше подойдет. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ZVano
Дата 23.5.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(Alexeis @  23.5.2011,  14:33 Найти цитируемый пост)
Я бы воспользовался классом TStringStream 

1. Т.е. вместо TFileStream использовать TStringStream,  затем TStringStream преобразовывать в RawByteString?

2. Или вместо RawByteString использовать TStringStream?
Если 2е, то так не пойдет т.к. задача вносит ограничения.
Кусок кода - заглушка, которая эмулирует загрузку блобов из курсора Oracle (результат выхова хранимой процедуры).
Курсор же представлен массивом Blobs[] типа RawByteString.
Блобы содержат картинки в формате JPG.
Код

//uADStranParam.hpp
class PASCALIMPLEMENTATION TADParam : public Classes::TCollectionItem
{
    typedef Classes::TCollectionItem inherited;
...

public:
    __property System::RawByteString AsBlobs[int AIndex] = {read=GetAsByteStrs, write=SetAsBlobs};
...
}


Цитата(Alexeis @  23.5.2011,  14:33 Найти цитируемый пост)

Такая строка является объектом. Нельзя данные писать напрямую в объект. Можно писать в буфер заданного размера. 

Реализацию слизал с паскалевского кода не особо задумываясь о внутреннем представлении smile
Код

//http://www.rsdn.ru/forum/delphi/3834802.flat.aspx
Function StreamToRawByteString(F:TStream):RawByteString;
begin
  SetLength(Result,F.Size);
  F.Position:=0;
  F.Read(PAnsiChar(Result)^,F.Size);   // такой финт ушами будет несколько быстрее
end;

procedure TForm1.Button2Click(Sender: TObject);
var S:RawByteString;
    F:TFileStream;
begin
  F:=TFileStream.Create('MyFileName.txt',fmOpenRead);
  S:=StreamToRawByteString(F);
  F.Free;
  Memo1.Text:=S;   // ну а тут ты уже сам перекодируй, но в строке у тебя именно то, что прочитали из файла
end;



Это сообщение отредактировал(а) ZVano - 23.5.2011, 15:30


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Alexeis
Дата 23.5.2011, 15:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Я имел ввиду использовать свойство DataString класса TStringStream , так чтобы никуда ничего не преобразовать.

Добавлено через 51 секунду
А так вместо F.Read(PAnsiChar(Result)^,F.Size); сделать F.Read(&Result[1],F.Size);


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ZVano
Дата 23.5.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(Alexeis @ 23.5.2011,  15:51)
Я имел ввиду использовать свойство DataString класса TStringStream , так чтобы никуда ничего не преобразовать.

Добавлено @ 15:52
А так вместо F.Read(PAnsiChar(Result)^,F.Size); сделать F.Read(&Result[1],F.Size);

Спасибо. Ваше замечание помогло решить задачу. 
Правда, сделал это несколько по другому.
Код

TFileStream * imgStream = new TFileStream(filePath, fmOpenRead);
try {
   RawByteString imgRaw;
   imgRaw.SetLength(imgStream->Size);
   imgStream->Position = 0;
   imgStream->Read(imgRaw.c_str(), imgStream->Size);
}
__finally {
  imgStream->Free();
}



--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
xvr
Дата 24.5.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(ZVano @  23.5.2011,  12:25 Найти цитируемый пост)

typedef AnsiStringT<65535> RawByteString;

Цитата(ZVano @  23.5.2011,  12:25 Найти цитируемый пост)
Может, RawByteString не может хранить данных такого размера(77 040)?
Он то может, а вот тем, кто лежит в памяти после него, не поздоровится  smile 

PM MAIL   Вверх
ZVano
Дата 25.5.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(xvr @  24.5.2011,  20:42 Найти цитируемый пост)
Он то может, а вот тем, кто лежит в памяти после него, не поздоровится   

Абалдеть....
Что же делать? Использование типа "RawByteString" предопределено параметром компонента TADStoredProc. А данные полюбому превышают этот размер.
Правда, покаместь прога не гавкала о попытках записи в чужую память. Загружал многократно по 20 картинок размером 70..200кб


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Alexeis
Дата 25.5.2011, 18:07 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



ZVano, это он так шутит про твой первый код, где ты затираешь содержимое объекта. Строки в билдере могут хранить до 2х Гб информации.

Добавлено через 2 минуты и 54 секунды
AnsiStringT<65535> - в угловых скобках означает номер кодовой страницы анси в которой закодирована строка. RawByteString не имеет никакой кодировки, используется просто как буфер данных. На самом деле эти кодировки вводились для корректной конвертации юникода в анси строки и обратно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ZVano
Дата 26.5.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Alexeis, спасибо за пояснение.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.