Вы не вошли.
сразу предупреждаю, абсолютный "0".
нужно работать с файлами, как просто с некоторым набором данных(байтов), после этого сохоранить результ обработки в другом, вновь созданном файле (размер выходного файла 1-2 МВ
вопрос?
как , с какими может компонентами к этому подступиться?
Вне форума
Используете Open Dialog для получения имени файла, который открываете:
if(OpenDialog->Execute())
{ Name = OpenDialog->FileName; MyFileOpen(Name); }
В функции MyFileOpen используем следующее:
ifstream file(Name.c_str(), ios::binary); - создаем ifstream
file.read((char *)Data, sizeof(Data)); - читаем данные
file.close(); - закрываем файл
При сохранении используем Save Dialog для получения Name,
ofstream file(Name.c_str(), ios::binary); - создаем ofstream
for(int i=0; i<sizeof(Data); i++) file << Data[i]; - записываем данные
file.close(); - закрываем файл
Вне форума
Liv, спасибо, примерно чтото подобное пробовал делать, только не совсем понимая что.. . попробую разобраться в Вашем примере.
Формально подхожу по старинке(РК86,ZX-Spectrum),(как к дампу),
->загрузил в ОЗУ,-> отредактировал,(вручную, или программно),
->сдвинул данные,если нужно, скажем первых N байт удаляется,-> сохранил в новом(причем таких обработано/объединяемых файлов может быть N штук- объединенных в один, назовем его*.bin), ну и еще там чего то , но это уже не принципиально, дело техники, вот с чем к этому подойти ,пока хожу вокруг этой глыбы (:
Отредактировано Vasil (07.09.2004 22:38:32)
Вне форума
Честно признаюсь, гулял с подругой, напипились пива... потому и пишу, впрочем )
но все должно работать, тем не менее.
Правильность имен функций гарантирую, а вот порядок следования аргументов могу и перепутать. Просьба посмотреть в хэлпе.
AnsiString FName = "input.file";// имя файла с исходными данными
int FHandle, FSize;// дескриптор файла и размер файла
BYTE *inbuf, *outbuf; //будут динамические буферы для данных
FHandle = FileOpen(FName, fmOpenRead);//открыли исходный файл для чтения
FSize = FileSeek(FHandle,0,2);// нашли размер исходного файла - просто получили значение файлового указателя при ео положении в конце файла
FileSeek(FHandle,0,0);//вернулись обратно в начало файла
inbuf = new BYTE[FSize];//выделили в памяти место под буфер для исходного файла
FileRead(FHandle,inbuf,FSize);//прочли файл в буфер
FileClose(FHandle);//закрыли дескриптор
int tmp = 5;//просто переменная. здесь - смещение указателя в исходном массиве от его начала
outbuf = new BYTE[FSize-tmp];//создали буфер под обработанные данные
memcpy((BYTE*)(&inbuf[tmp]),outbuf);//скопировали данные из исходного буфера, начиная с байта inbuf[tmp], в буфер результата.
FName = "output.file";//задали имя файла результата
FHandle = FileCreate(FName);// создали файл. Если существовал - перетрется
FileWrite(FHandle,outbuf,FSize-tmp);// записали результат в файл
FileClose(FHandle);//закрыли дескриптор
delete[] inbuf; //очищаем выделенную память
delete[] outbuf;
Естественно, очень желательно отлавливать возможные исключения.
В данном коде получаем байтовый массив, с которым можно делать что угодно.
Думаю, особых трудностей не должно возникнуть. Нужно сцепить несколько обработанных файлов - делаете нужное количество буферов, обрабатываете, создаете результирующий буффер суммарного размера и пишите в него последовательно. Или можно сразу открыть результирующий файл и писать прямо в него, не выделяя буффер под результат в памяти.
В принципе, это элементарные операции с файлами и указателями. Просто не поленитесь и уясните, что такое указатели, их связь с массивами, арифметику указателей, преобразование типов. Тогда С станет лучшим из многих.
Как только разберетесь с классами, С++ станет для Вас лучшим из всех.
Вне форума
да, замеченные ошибки
в memcpy есть еще третий аргумент, указывающий количество байт, которые нужно скопировать.
Одним словом, обязательно проверьте по хэлпу, в Билдерах он отличный.
Кста, использовать sizeof для определения размера динамических массивов не советую.
В Билдере он загадочным образом может то работать, то нет. для статических, для классов(структур) - без вопросов, все идеально.
Вне форума
ну, целая поэма -:), еще раз спасибо, и что не поленились прокомментировать. Накачал тут книг, завалился ими, но "негритята" как то раздражают, хочется реальную задачу(как для меня) решать, только определиться еще нужно, в каком я сам класе -:)
ЗЫ, честно говоря, долго не решался задАть вопрос и особо не рассчитывал на ответ (наверное мне повезло-:)), вобщем, весьма признателен ответившим
Отредактировано Vasil (08.09.2004 08:16:45)
Вне форума
Если будут ну совсем уж неразрешимые трудности, обращайтесь.
Аська 199923436.
Вне форума
спасибо, не хотелось бы злоупотреблять, разве что если будут ну совсем уж, НУ-, тут еще "над собой" работать и работать(:-
Вне форума
злоупотребляй. поможет
Вне форума
Намчет примера Liv это подход от старенького досовского Borland C++ Turbo 3.0 данный способ хорош, только уж сильно старенький.
Не рекомендую его использовать если пишите на Builder под Windows.
Насчет примера от PM то єто подход WIN API.
memcpy это тоже старинка
FileCreate
FileWrite
FileClose
Я не сторонник и єтого способа, ну зачем тебе єти Create и прочее.
Если ты только начинаешь разбираться испольуй простенькие методы
LoadFormFile
SaveToFile
Тох же Memo, RichEdit, ListBox или что-то в єтом духе.
Простенько и со вкусом,
И применять динамическое создание переменных, и простенькое удаление delete крайне не рекомендую, есть такоя штука, назівается "утечка памяти", скорее всего если использовать этот пример узнаешь что это такое.
Да к примеру Liv если работаете с бинарными файлами, то в качестве Data можно использовать структуру, но это я думаю сложновато для тебя.
Вне форума
[ Сгенерировано за 0.031 сек, 7 запросов выполнено - Использовано памяти: 600.93 Кбайт (Пик: 651.3 Кбайт) ]