Помощь - Поиск - Пользователи - Календарь
Полная версия: файлы большого размера
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
sva
у меня такая проблема: имеется два фаила, каждый более 64к. вопрос как можно соеденить их в один файл как массив байтов. (файлы не текстовые).
пожалуйста если можно подробней.
xds
Используй (псевдо)процедуры блочного ввода-вывода 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.

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

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

Для повышения производительности, можно попробовать несколько увеличть размер буфера. Предел лежит в районе 64K байт (килобайт? кибибайт? :D). Большего в BP сделать не удастся - использование нескольких буферов так или иначе приведёт к нескольким вызовам BlockRead, т. е. нулевой выгоде.
hiv
В командной строке набери:
Код
copy file1 + file2 file3
Так можно объеденить два файла и записать в третий. Только есть ньюанс - в конце третьего файла иногда добавляется лишний байт, символизирующий конец файла Ctrl-Z.
sva
XBS:
Я ПОНЯЛ!!!! r: integer - это объем всего файла целиком.! БОЛЬШОЕ СПАСИБО ВЫ ЗДОРОВО ПОМОГЛИ МНЕ.

HIV:
Я ТАК КОНЕЧНО НЕ ПРОБОВАЛ, НО ОБЯЗАТЕЛЬНО ОПРОБУЮ. СПАСИБО ЗЯ ПОМОЩЬ.
xds
1) К сожалению, r хранит не размер всего файла целиком, а размер очередной порции данных, успешно считанных в буфер.

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

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