Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 7

Чтение файла

01.03.2014, 08:43. Показов 1978. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Очередной раз сталкиваюсь со странностями билдера (своей тупостью?).
В файл записываются файлы (картинки jpg) в формате:
кол-во файлов (uint)
ид_файла_1 (uint)
размер_файла_1 (long)
байты (char *)

ид_файла_2
...
Файлы картинок размером не более 1Мб.

Пытаюсь считывать следующим кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
unsigned int fC;
fread(&fC, sUInt, 1, file);
 
while(fC--)
{
    long _S;
    unsigned int fid;
    fread(&fid, sUInt, 1, file);    // Считываем ID файла
    fread(&_S, sLong, 1, file); // Считываем размер файла
 
    String fn = exePath + String("tmp\\") + session_id + String("_") + randomString(12) + ".jpg";
 
    char *fr = new char[_S];
        fread(fr, sChar, _S, file);
 
        FILE *f = fopen(AnsiString(fn).c_str(), "wb+");
            fwrite(fr, sChar, _S, f);
                        
        FILES[fid] = fn;
        FILESF[fid] = f;
    delete [] fr;
}
Вместо к примеру 2 файлов создает ~50 одинакового размера, но битые.

Если перед
C++
1
while(fC--)
вставить строчку
C++
1
ShowMessage(fC);
, то все прекрасно работает. Что не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2014, 08:43
Ответы с готовыми решениями:

Чтение файла
Задача такая... Имеется текстовый файл, в котором даны массивы чисел, разделенных строкой текста,цБ: "Распродажа 1 1 2 3 4 5...

Чтение с файла
Здравствуйте! Скажите пожалуйста, как лучше переписать из файла txt данные в StringGrid используя OpenDialog(Надо ли еще использовать какую...

Чтение из файла
Необходимо переменной str присвоить значение всего текста в файле

4
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
01.03.2014, 11:07
Цитата Сообщение от evo3 Посмотреть сообщение
C++
1
2
FILE *f = fopen(AnsiString(fn).c_str(), "wb+");
* * * * * * fwrite(fr, sChar, _S, f);
Возможно поможет это
C++
1
2
3
4
5
6
FILE *f = fopen(AnsiString(fn).c_str(), "wb+");
if (f) {
* * * * * * fwrite(fr, sChar, _S, f);
            fflush(f);
            fclose(f);    
}
Добавлено через 2 минуты
А вообще предлагаю тебе воспользоваться нормальным контейнером для хранения картинок
C++
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
65
66
67
68
69
70
71
// ---------------------------------------------------------------------------
#include <memory>
#include <IOUtils.hpp>
#include <JPEG.hpp>
 
// ---------------------------------------------------------------------------
class TPictureItem : public TCollectionItem {
private:
    TPicture *FPicture;
    void __fastcall SetImage(TPicture *APicture) {
        FPicture->Assign(APicture);
    }
public:
    __fastcall TPictureItem(TCollection* Collection):TCollectionItem(Collection) {
        FPicture = new TPicture();
    };
    virtual __fastcall ~TPictureItem() {
        delete FPicture;
    }
__published:
    __property TPicture *Picture = {read = FPicture, write = SetImage};
 
};
 
// ---------------------------------------------------------------------------
class TPictureCollection : public TCollection {
private:
    TPictureItem* __fastcall GetItem(const int iIndex) {
        return dynamic_cast<TPictureItem *>(TCollection::Items[iIndex]);
    }
    void __fastcall SetItem(const int iIndex, TPictureItem *AItem) {
        TCollection::Items[iIndex] = AItem;
    }
public:
    __fastcall TPictureCollection(TCollectionItemClass ItemClass):TCollection(ItemClass) {
    }
    virtual __fastcall ~TPictureCollection() {}
 
    TPictureItem *__fastcall Add() {
        return dynamic_cast<TPictureItem *>(TCollection::Add());
    }
    TPictureItem* __fastcall Insert(int Index) {
        return dynamic_cast<TPictureItem *>(TCollection::Insert(Index));
    }
    __property TPictureItem* Item[int Index] = {read=GetItem, write=SetItem};
};
 
// ---------------------------------------------------------------------------
class TPictureContainer : public TComponent
{
private:
    TPictureCollection *FItems;
public:
    __fastcall TPictureContainer(TComponent *AOwner): TComponent(AOwner) {
        FItems = new TPictureCollection(__classid(TPictureItem));
    }
    virtual __fastcall ~TPictureContainer() {
        delete FItems;
    }
 
    void __fastcall SaveToFile(const UnicodeString &sFileName) {
         WriteComponentResFile(sFileName, this);
    }
 
    void __fastcall LoadFromFile(const UnicodeString &sFileName) {
         ReadComponentResFile(sFileName, this);
    }
 
__published:
     __property TPictureCollection *Items = {read = FItems, write = FItems};
};
Пример использования:
C++
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
// запись в контейнер
std::auto_ptr<TPictureContainer>APictureContainer(new TPictureContainer(this));
 
// получаем список всех файлов с расширением *.jpg
TStringDynArray ADynArray = TDirectory::GetFiles("g:/test", "*.jpg");
for (int i = 0; i < ADynArray.Length; i++) {
     // добавляем в контейнер
     TPictureItem *AItem = APictureContainer->Items->Add();
     AItem->Picture->LoadFromFile(ADynArray[i]);
}
 
APictureContainer->SaveToFile("g:/test/picture_container.bin");
 
// чтение из контейнера
std::auto_ptr<TPictureContainer>APictureContainer2(new TPictureContainer(this));
APictureContainer2->LoadFromFile("g:/test/picture_container.bin");
for (int i = 0; i <APictureContainer2->Items->Count; i++) {
    // демо
    std::auto_ptr<TForm>AForm(new TForm(this));
    TImage *AImage = new TImage(AForm.get());
    AImage->Parent = AForm.get();
    AImage->Align = alClient;
    // считываем из контейнера
    AImage->Picture->Assign(APictureContainer2->Items->Item[i]->Picture);
    AForm->ShowModal();
}
0
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 7
01.03.2014, 11:57  [ТС]
Контейнер - это конечно хорошо, но кроме картинок там хранятся другие данные.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
01.03.2014, 13:16
Цитата Сообщение от evo3 Посмотреть сообщение
Контейнер - это конечно хорошо, но кроме картинок там хранятся другие данные.
Так в чём проблема? Храни любые данные

Здесь для примера я добавил в элемент контейнера целое число, число с плавающей точкой и строку.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TPictureItem : public TCollectionItem {
private:
    TPicture *FPicture;
    void __fastcall SetImage(TPicture *APicture) {
        FPicture->Assign(APicture);
    }
    int FIntValue;
    double FDoubleValue;
    UnicodeString FStringValue;
public:
    __fastcall TPictureItem(TCollection* Collection):TCollectionItem(Collection) {
        FPicture = new TPicture();
    };
    virtual __fastcall ~TPictureItem() {
        delete FPicture;
    }
__published:
    __property TPicture *Picture = {read = FPicture, write = SetImage};
    __property int IntValue = {read = FIntValue, write = FIntValue};
    __property double DoubleValue = {read=FDoubleValue, write=FDoubleValue};
    __property UnicodeString StringValue = {read=FStringValue, write=FStringValue};
};
То есть, если ты работаешь в Билдере и используешь его объекты,
то почему бы не использовать сериализацию средствами RTTI.
Это очень просто и удобно

Вот пример, как использовать дополнительные данные

C++
1
2
3
4
5
// добавляем в контейнер
TPictureItem *AItem = APictureContainer->Items->Add();
AItem->Picture->LoadFromFile(ADynArray[i]);
AItem->IntValue = 0;
AItem->StringValue = "Название картинки";
И эти данные также будут сохранены в файле
1
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 7
01.03.2014, 13:41  [ТС]
Спасибо за ответ, буду изучать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2014, 13:41
Помогаю со студенческими работами здесь

Чтение/запись из файла
Здравствуйте! Такой вот вопрос: есть файл,который мы читаем, он представляет из себя массив одномерный в виде 10101010100010101010.......

Чтение BMP файла
Пишу программу в которой необходимо считать заголовок BMP файла. Файл безпалитровый, глубина цвета 24, то есть по 8 бит каждой составляющей...

C++ Builder, чтение с файла
Помогите пожалуйста исправить ошибку при чтении с файла (файл не читается). Нужно иметь возможность ввести данные в таблицу и сохранить в...

Чтение из длинного файла
Здравствуйте. Подскажите пожалуйста как правильно реализовать? У меня есть текстовый файл(таблица) со значениями разделенными табуляциями и...

Чтение из файла в массив
Привет, есть файл.тхт следующего содержания: 2405 UT2321 TSK 1262 PIN 1220 2505 UT2221 TSK 1232 PIN 1120 2605 UT2311 TSK 1272 PIN...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru