IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> файлы большого размера, как соеденить
сообщение
Сообщение #1


Гость






у меня такая проблема: имеется два фаила, каждый более 64к. вопрос как можно соеденить их в один файл как массив байтов. (файлы не текстовые).
пожалуйста если можно подробней.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Используй (псевдо)процедуры блочного ввода-вывода BlockRead, BlockWrite (для детального понимания почитай в книжке по Паскалю про тип File и эти процедуры).

program Merge;

var
fi, fo: File;
Buf: array[0..8191] of Byte;
r: Integer;

begin
Assign(fo, 'merged.dat');
Rewrite(fo, 1);

Assign(fi, 'chunk1.dat');
Reset(fi, 1);
repeat
BlockRead(fi, Buf, SizeOf(Buf), r);
BlockWrite(fo, Buf, r);
until r < SizeOf(Buf);
Close(fi);

Assign(fi, 'chunk2.dat');
Reset(fi, 1);
repeat
BlockRead(fi, Buf, SizeOf(Buf), r);
BlockWrite(fo, Buf, r);
until r < SizeOf(Buf);
Close(fi);

Close(fo);
end.



--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






пробывал я так. но дело в том что файлы эти очень большие, а в буфер лезит только не больше 65521 байт... я кажется понимаю, что их надо как то резать на куски, но как это организовать не пойму
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


В моём примере в буфер помещается не больше 8192 байт, тем не менее, это позволяет объеденять файлы любого размера. Посмотри внимательно на код выше - файлы там действительно режутся на куски по <= 8192 байт. Сначала читается кусок из входного файла. Кол-во считанных байт (8192 или меньше, если прочитан "хвост" файла - ведь размер последнего не обязательно кратен 8192 байтам) записывается в r. Затем r байт записыватеся в выходной файл и эти операции повторяются до тех пор, пока не будет, наконец, скопирован этот самый "хвост". Тоже самое происходит и со вторым входным файлом.

Процедуры BlockRead и BlockWrite автоматически увеличивают указатель текущей позиции файла на число считанных (записанных) байт. Т. о., каждый цикл постепенно перемещается по каждому входному файлу от начала до конца. Каждый вызов BlockWrite в данном примере дописывает данные из буфера в конец выходного файла.

Для повышения производительности, можно попробовать несколько увеличть размер буфера. Предел лежит в районе 64K байт (килобайт? кибибайт? :D). Большего в BP сделать не удастся - использование нескольких буферов так или иначе приведёт к нескольким вызовам BlockRead, т. е. нулевой выгоде.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


В командной строке набери:
Код
copy file1 + file2 file3
Так можно объеденить два файла и записать в третий. Только есть ньюанс - в конце третьего файла иногда добавляется лишний байт, символизирующий конец файла Ctrl-Z.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






XBS:
Я ПОНЯЛ!!!! r: integer - это объем всего файла целиком.! БОЛЬШОЕ СПАСИБО ВЫ ЗДОРОВО ПОМОГЛИ МНЕ.

HIV:
Я ТАК КОНЕЧНО НЕ ПРОБОВАЛ, НО ОБЯЗАТЕЛЬНО ОПРОБУЮ. СПАСИБО ЗЯ ПОМОЩЬ.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


1) К сожалению, r хранит не размер всего файла целиком, а размер очередной порции данных, успешно считанных в буфер.

2) Желательно делать так
Код
copy /b file1 + file2 file3
иначе Ctrl-Z не только запишется в конец выходного файла, но на этом же символе (EOF, ASCII 26) прекратится чтение входных файлов.

3) Раз уж тут большинством решили, что уровень грамотности на форуме средний, имеет смысл следить за опечатками хотя бы в именах собственных. smile.gif


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 15.05.2024 13:26
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name